*
* Generated from xml/schema/CRM/ACL/ACL.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:71681f363debd53627c4c98a9032b0f6)
+ * (GenCodeChecksum:810da5f19a7ead8c949065156674c087)
*/
/**
/**
* Unique table ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this ACL entry Allow (0) or Deny (1) ?
*
- * @var boolean
+ * @var bool
*/
public $deny;
/**
* ID of the object possessing this ACL
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* The ID of the object controlled by this ACL entry
*
- * @var int unsigned
+ * @var int
*/
public $object_id;
/**
* ID of the ACL or ACL group being granted/revoked
*
- * @var int unsigned
+ * @var int
*/
public $acl_id;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
],
'pseudoconstant' => [
'callback' => 'CRM_ACL_BAO_ACL::operation',
- ]
+ ],
],
'object_table' => [
'name' => 'object_table',
*
* Generated from xml/schema/CRM/ACL/Cache.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7551610e08f73f20ef3e5b9ef6782f80)
+ * (GenCodeChecksum:f993d89f3a44999eed1b4c46b714b736)
*/
/**
/**
* Unique table ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign Key to Contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Foreign Key to ACL
*
- * @var int unsigned
+ * @var int
*/
public $acl_id;
*
* Generated from xml/schema/CRM/ACL/EntityRole.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c53e5bc404fee6d3f005fbaf15abdb4e)
+ * (GenCodeChecksum:65952cc85e04acddbaef65cfcf7fc541)
*/
/**
/**
* Unique table ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign Key to ACL Role (which is an option value pair and hence an implicit FK)
*
- * @var int unsigned
+ * @var int
*/
public $acl_role_id;
/**
* ID of the group/contact object being joined
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
'source_contact_id',
'source_contact_name',
'assignee_contact_id',
- 'target_contact_id',
'assignee_contact_name',
'status_id',
'subject',
$activityParams['return'][] = $attr;
}
}
- $result = civicrm_api3('Activity', 'Get', $activityParams);
+ $result = civicrm_api3('Activity', 'Get', $activityParams)['values'];
$bulkActivityTypeID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Bulk Email');
$allCampaigns = CRM_Campaign_BAO_Campaign::getCampaigns(NULL, NULL, FALSE, FALSE, FALSE, TRUE);
(CRM_Mailing_Info::workflowEnabled() && CRM_Core_Permission::check('create mailings'))
);
+ // @todo - get rid of this & just handle in the array declaration like we do with 'subject' etc.
$mappingParams = [
- 'id' => 'activity_id',
'source_record_id' => 'source_record_id',
'activity_type_id' => 'activity_type_id',
- 'activity_date_time' => 'activity_date_time',
'status_id' => 'status_id',
- 'subject' => 'subject',
'campaign_id' => 'campaign_id',
- 'assignee_contact_name' => 'assignee_contact_name',
- 'source_contact_id' => 'source_contact_id',
- 'source_contact_name' => 'source_contact_name',
'case_id' => 'case_id',
];
- foreach ($result['values'] as $id => $activity) {
-
- $activities[$id] = [];
-
- $isBulkActivity = (!$bulkActivityTypeID || ($bulkActivityTypeID === $activity['activity_type_id']));
- $activities[$id]['target_contact_counter'] = count($activity['target_contact_id']);
- if ($activities[$id]['target_contact_counter']) {
- try {
- $activities[$id]['target_contact_name'][$activity['target_contact_id'][0]] = civicrm_api3('Contact', 'getvalue', ['id' => $activity['target_contact_id'][0], 'return' => 'sort_name']);
+ if (empty($result)) {
+ $targetCount = [];
+ }
+ else {
+ $targetCount = CRM_Core_DAO::executeQuery('
+ SELECT activity_id, count(*) as target_contact_count
+ FROM civicrm_activity_contact
+ INNER JOIN civicrm_contact c ON contact_id = c.id AND c.is_deleted = 0
+ WHERE activity_id IN (' . implode(',', array_keys($result)) . ')
+ AND record_type_id = %1
+ GROUP BY activity_id', [
+ 1 => [
+ CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Targets'),
+ 'Integer'
+ ]
+ ])->fetchAll();
+ }
+ foreach ($targetCount as $activityTarget) {
+ $result[$activityTarget['activity_id']]['target_contact_count'] = $activityTarget['target_contact_count'];
+ }
+ // Iterate through & do basic mappings & determine which ones we want to retrieve target count for.
+ foreach ($result as $id => $activity) {
+ $activities[$id] = [
+ 'activity_id' => $activity['id'],
+ 'activity_date_time' => CRM_Utils_Array::value('activity_date_time', $activity),
+ 'subject' => CRM_Utils_Array::value('subject', $activity),
+ 'assignee_contact_name' => CRM_Utils_Array::value('assignee_contact_sort_name', $activity, []),
+ 'source_contact_id' => CRM_Utils_Array::value('source_contact_id', $activity),
+ 'source_contact_name' => CRM_Utils_Array::value('source_contact_sort_name', $activity),
+ ];
+ $activities[$id]['activity_type_name'] = CRM_Core_PseudoConstant::getName('CRM_Activity_BAO_Activity', 'activity_type_id', $activity['activity_type_id']);
+ $activities[$id]['activity_type'] = CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_type_id', $activity['activity_type_id']);
+ $activities[$id]['target_contact_count'] = CRM_Utils_Array::value('target_contact_count', $activity, 0);
+ if (!empty($activity['target_contact_count'])) {
+ $displayedTarget = civicrm_api3('ActivityContact', 'get', [
+ 'activity_id' => $id,
+ 'check_permissions' => TRUE,
+ 'options' => ['limit' => 1],
+ 'record_type_id' => 'Activity Targets',
+ 'return' => ['contact_id.sort_name', 'contact_id'],
+ 'sequential' => 1,
+ ])['values'];
+ if (empty($displayedTarget[0])) {
+ $activities[$id]['target_contact_name'] = [];
}
- catch (CiviCRM_API3_Exception $e) {
- // Really they should have names but a fatal here feels wrong.
- $activities[$id]['target_contact_name'] = '';
+ else {
+ $activities[$id]['target_contact_name'] = [$displayedTarget[0]['contact_id'] => $displayedTarget[0]['contact_id.sort_name']];
}
}
+ if ($activities[$id]['activity_type_name'] === 'Bulk Email') {
+ $bulkActivities[] = $id;
+ // Get the total without permissions being passed but only display names after permissioning.
+ $activities[$id]['recipients'] = ts('(%1 recipients)', [1 => $activities[$id]['target_contact_count']]);
+ }
+ }
+
+ // Eventually this second iteration should just handle the target contacts. It's a bit muddled at
+ // the moment as the bulk activity stuff needs unravelling & test coverage.
+ foreach ($result as $id => $activity) {
+ $isBulkActivity = (!$bulkActivityTypeID || ($bulkActivityTypeID === $activity['activity_type_id']));
foreach ($mappingParams as $apiKey => $expectedName) {
if (in_array($apiKey, [
- 'assignee_contact_name',
'target_contact_name',
])) {
- $activities[$id][$expectedName] = CRM_Utils_Array::value($apiKey, $activity, []);
if ($isBulkActivity) {
- $activities[$id]['recipients'] = ts('(%1 recipients)', [1 => count($activity['target_contact_name'])]);
+ // @todo - how is this used? Couldn't we use 'is_bulk' or something clearer?
+ // or the calling function could handle
$activities[$id]['mailingId'] = FALSE;
if ($accessCiviMail &&
($mailingIDs === TRUE || in_array($activity['source_record_id'], $mailingIDs))
}
}
else {
+ // @todo this generic assign could just be handled in array declaration earlier.
$activities[$id][$expectedName] = CRM_Utils_Array::value($apiKey, $activity);
- if ($apiKey == 'activity_type_id') {
- $activities[$id]['activity_type'] = CRM_Core_PseudoConstant::getName('CRM_Activity_BAO_Activity', 'activity_type_id', $activities[$id][$expectedName]);
- }
- elseif ($apiKey == 'campaign_id') {
+ if ($apiKey == 'campaign_id') {
$activities[$id]['campaign'] = CRM_Utils_Array::value($activities[$id][$expectedName], $allCampaigns);
}
}
}
/**
- * Checks if user has permissions to edit inbound e-mails, either bsic info
+ * Checks if user has permissions to edit inbound e-mails, either basic info
* or both basic information and content.
*
* @return bool
elseif (!empty($values['recipients'])) {
$activity['target_contact_name'] = $values['recipients'];
}
- elseif (isset($values['target_contact_counter']) && $values['target_contact_counter']) {
+ elseif (isset($values['target_contact_count']) && $values['target_contact_count']) {
$activity['target_contact_name'] = '';
$firstTargetName = reset($values['target_contact_name']);
$firstTargetContactID = key($values['target_contact_name']);
$activity['target_contact_name'] .= $targetLink;
}
- if ($extraCount = $values['target_contact_counter'] - 1) {
+ if ($extraCount = $values['target_contact_count'] - 1) {
$activity['target_contact_name'] .= ";<br />" . "(" . ts('%1 more', [1 => $extraCount]) . ")";
}
if ($showContactOverlay) {
public function addAttachment(&$attachments, $contacts) {
// Check preferences setting
if (Civi::settings()->get('activity_assignee_notification_ics')) {
- $config = &CRM_Core_Config::singleton();
- $this->icsfile = tempnam($config->customFileUploadDir, 'ics');
+ $this->icsfile = tempnam(CRM_Core_Config::singleton()->customFileUploadDir, 'ics');
if ($this->icsfile !== FALSE) {
rename($this->icsfile, $this->icsfile . '.ics');
$this->icsfile .= '.ics';
*
* Generated from xml/schema/CRM/Activity/Activity.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ffa557668a214e3683b1692238ad74ae)
+ * (GenCodeChecksum:808e801e250ba56b83f69fe90d8b52c2)
*/
/**
/**
* Unique Other Activity ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Artificial FK to original transaction (e.g. contribution) IF it is not an Activity. Table can be figured out through activity_type_id, and further through component registry.
*
- * @var int unsigned
+ * @var int
*/
public $source_record_id;
/**
* FK to civicrm_option_value.id, that has to be valid, registered activity type.
*
- * @var int unsigned
+ * @var int
*/
public $activity_type_id;
/**
* Planned or actual duration of activity expressed in minutes. Conglomerate of former duration_hours and duration_minutes.
*
- * @var int unsigned
+ * @var int
*/
public $duration;
/**
* Phone ID of the number called (optional - used if an existing phone number is selected).
*
- * @var int unsigned
+ * @var int
*/
public $phone_id;
/**
* ID of the status this activity is currently in. Foreign key to civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* ID of the priority given to this activity. Foreign key to civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $priority_id;
/**
* Parent meeting ID (if this is a follow-up item). This is not currently implemented
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
* Activity Medium, Implicit FK to civicrm_option_value where option_group = encounter_medium.
*
- * @var int unsigned
+ * @var int
*/
public $medium_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_auto;
/**
* FK to Relationship ID
*
- * @var int unsigned
+ * @var int
*/
public $relationship_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_current_revision;
/**
* Activity ID of the first activity record in versioning chain.
*
- * @var int unsigned
+ * @var int
*/
public $original_id;
public $result;
/**
- * @var boolean
+ * @var bool
*/
public $is_deleted;
/**
* The campaign for which this activity has been triggered.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* Assign a specific level of engagement to this activity. Used for tracking constituents in ladder of engagement.
*
- * @var int unsigned
+ * @var int
*/
public $engagement_level;
/**
* Activity marked as favorite.
*
- * @var boolean
+ * @var bool
*/
public $is_star;
'pseudoconstant' => [
'optionGroupName' => 'activity_type',
'optionEditPath' => 'civicrm/admin/options/activity_type',
- ]
+ ],
],
'activity_subject' => [
'name' => 'subject',
'pseudoconstant' => [
'optionGroupName' => 'activity_status',
'optionEditPath' => 'civicrm/admin/options/activity_status',
- ]
+ ],
],
'priority_id' => [
'name' => 'priority_id',
'pseudoconstant' => [
'optionGroupName' => 'priority',
'optionEditPath' => 'civicrm/admin/options/priority',
- ]
+ ],
],
'parent_id' => [
'name' => 'parent_id',
'pseudoconstant' => [
'optionGroupName' => 'encounter_medium',
'optionEditPath' => 'civicrm/admin/options/encounter_medium',
- ]
+ ],
],
'is_auto' => [
'name' => 'is_auto',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'activity_engagement_level' => [
'name' => 'engagement_level',
'pseudoconstant' => [
'optionGroupName' => 'engagement_index',
'optionEditPath' => 'civicrm/admin/options/engagement_index',
- ]
+ ],
],
'weight' => [
'name' => 'weight',
*
* Generated from xml/schema/CRM/Activity/ActivityContact.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ff5291c3d7067182669807aa125fef72)
+ * (GenCodeChecksum:bb5726fd8dc1e07e19a08982d502a9f1)
*/
/**
/**
* Activity contact id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to the activity for this record.
*
- * @var int unsigned
+ * @var int
*/
public $activity_id;
/**
* Foreign key to the contact for this record.
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Nature of this contact's role in the activity: 1 assignee, 2 creator, 3 focus or target.
*
- * @var int unsigned
+ * @var int
*/
public $record_type_id;
'pseudoconstant' => [
'optionGroupName' => 'activity_contacts',
'optionEditPath' => 'civicrm/admin/options/activity_contacts',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
/**
* Survey activity.
*
- * @var boolean
+ * @var bool
*/
protected $_isSurveyActivity;
* Note: This is a class property so that child classes can turn off this
* behavior (e.g. in CRM_Case_Form_Activity)
*
- * @var boolean
+ * @var bool
*
*/
}
// CRM-15472 - 50 is around the practical limit of how many items a select2 entityRef can handle
- if ($this->_action == 2 && !empty($defaults['target_contact_id'])) {
+ if ($this->_action == CRM_Core_Action::UPDATE && !empty($defaults['target_contact_id'])) {
$count = count(is_array($defaults['target_contact_id']) ? $defaults['target_contact_id'] : explode(',', $defaults['target_contact_id']));
if ($count > 50) {
$this->freeze(['target_contact_id']);
return $defaults;
}
+ /**
+ * Build Quick form.
+ *
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
+ */
public function buildQuickForm() {
if ($this->_action & (CRM_Core_Action::DELETE | CRM_Core_Action::RENEW)) {
//enable form element (ActivityLinks sets this true)
$errors['activity_type_id'] = ts('Activity Type is a required field');
}
- if (CRM_Utils_Array::value('activity_type_id', $fields) == 3 &&
- CRM_Utils_Array::value('status_id', $fields) == 1
- ) {
+ if (CRM_Utils_Array::value('activity_type_id', $fields) == CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Email')
+ && CRM_Utils_Array::value('status_id', $fields) == CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'status_id', 'Scheduled')) {
$errors['status_id'] = ts('You cannot record scheduled email activity.');
}
- elseif (CRM_Utils_Array::value('activity_type_id', $fields) == 4 &&
- CRM_Utils_Array::value('status_id', $fields) == 1
- ) {
+ elseif (CRM_Utils_Array::value('activity_type_id', $fields) == CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'SMS')
+ && CRM_Utils_Array::value('status_id', $fields) == CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'status_id', 'Scheduled')) {
$errors['status_id'] = ts('You cannot record scheduled SMS activity.');
}
*
*
* @param array $params
+ *
* @return array|null
+ * @throws \CiviCRM_API3_Exception
*/
public function postProcess($params = NULL) {
if ($this->_action & CRM_Core_Action::DELETE) {
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
* Are we operating in "single mode", i.e. deleting one
* specific Activity?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. sending sms to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
/**
* Is this field required
- * @var boolean
+ * @var bool
*/
public $_required;
/**
* Whether the file has a column header or not.
*
- * @var boolean
+ * @var bool
*/
protected $_haveColumnHeader;
$url = 'civicrm/contact/view/activity';
$qsView = "atype={$activityTypeId}&action=view&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
- if (CRM_Core_Permission::check('edit inbound email basic information')
- || CRM_Core_Permission::check('edit inbound email basic information and content')
- ) {
+ if (CRM_Activity_BAO_Activity::checkEditInboundEmailsPermissions()) {
$showDelete = $showUpdate = TRUE;
$qsUpdate = "atype={$activityTypeId}&action=update&reset=1&id=%%id%%&cid=%%cid%%&context=%%cxt%%{$extraParams}";
}
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
if (empty($params['id'])) {
// Set name on created but don't update on update as the machine name is not exposed.
- $params['name_b_a'] = CRM_Utils_String::munge($params['label_b_a']);
- $params['name_a_b'] = CRM_Utils_String::munge($params['label_a_b']);
+ $params['name_b_a'] = $params['label_b_a'];
+ $params['name_a_b'] = $params['label_a_b'];
}
$result = civicrm_api3('RelationshipType', 'create', $params);
*/
protected function getSettingsMetaData() {
if (empty($this->settingsMetadata)) {
- $allSettingMetaData = civicrm_api3('setting', 'getfields', []);
- $this->settingsMetadata = array_intersect_key($allSettingMetaData['values'], $this->_settings);
+ $this->settingsMetadata = \Civi\Core\SettingsMetadata::getMetadata(['name' => array_keys($this->_settings)], NULL, TRUE);
// This array_merge re-orders to the key order of $this->_settings.
$this->settingsMetadata = array_merge($this->_settings, $this->settingsMetadata);
}
$quickFormType = $this->getQuickFormType($props);
if (isset($quickFormType)) {
$options = CRM_Utils_Array::value('options', $props);
- if (isset($props['pseudoconstant'])) {
- $options = civicrm_api3('Setting', 'getoptions', [
- 'field' => $setting,
- ])['values'];
+ if ($options) {
if ($props['html_type'] === 'Select' && isset($props['is_required']) && $props['is_required'] === FALSE && !isset($options[''])) {
// If the spec specifies the field is not required add a null option.
// Why not if empty($props['is_required']) - basically this has been added to the spec & might not be set to TRUE
/**
* A boolean determining if you can add options to this group in the GUI.
*
- * @var boolean
+ * @var bool
*/
public static $_isLocked = FALSE;
while ($dao->fetch()) {
$totals[$dao->batch_id] = (array) $dao;
}
- $dao->free();
}
return $totals;
}
*
* Generated from xml/schema/CRM/Batch/Batch.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:5e14654e2df1b813931043edb9d0f828)
+ * (GenCodeChecksum:3e98e0127d48dfc44b2e6db904cd556f)
*/
/**
/**
* Unique Address ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $modified_id;
/**
* FK to Saved Search ID
*
- * @var int unsigned
+ * @var int
*/
public $saved_search_id;
/**
* fk to Batch Status options in civicrm_option_values
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* fk to Batch Type options in civicrm_option_values
*
- * @var int unsigned
+ * @var int
*/
public $type_id;
/**
* fk to Batch mode options in civicrm_option_values
*
- * @var int unsigned
+ * @var int
*/
public $mode_id;
/**
* Number of items in a batch.
*
- * @var int unsigned
+ * @var int
*/
public $item_count;
/**
* fk to Payment Instrument options in civicrm_option_values
*
- * @var int unsigned
+ * @var int
*/
public $payment_instrument_id;
'pseudoconstant' => [
'optionGroupName' => 'batch_status',
'optionEditPath' => 'civicrm/admin/options/batch_status',
- ]
+ ],
],
'type_id' => [
'name' => 'type_id',
'pseudoconstant' => [
'optionGroupName' => 'batch_type',
'optionEditPath' => 'civicrm/admin/options/batch_type',
- ]
+ ],
],
'mode_id' => [
'name' => 'mode_id',
'pseudoconstant' => [
'optionGroupName' => 'batch_mode',
'optionEditPath' => 'civicrm/admin/options/batch_mode',
- ]
+ ],
],
'total' => [
'name' => 'total',
'description' => ts('Total amount for this batch.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_batch.total',
'table_name' => 'civicrm_batch',
'pseudoconstant' => [
'optionGroupName' => 'payment_instrument',
'optionEditPath' => 'civicrm/admin/options/payment_instrument',
- ]
+ ],
],
'exported_date' => [
'name' => 'exported_date',
*
* Generated from xml/schema/CRM/Batch/EntityBatch.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ad54978e70be59ea54b414bbb3131f2f)
+ * (GenCodeChecksum:12e2c6e8e3c0890f0531819aebcfc543)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to entity table specified in entity_table column.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to civicrm_batch
*
- * @var int unsigned
+ * @var int
*/
public $batch_id;
'table' => 'civicrm_batch',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
return NULL;
}
- if (!(CRM_Utils_Array::value('id', $params))) {
+ if (empty($params['id'])) {
- if (!(CRM_Utils_Array::value('created_id', $params))) {
+ if (empty($params['created_id'])) {
$session = CRM_Core_Session::singleton();
$params['created_id'] = $session->get('userID');
}
- if (!(CRM_Utils_Array::value('created_date', $params))) {
+ if (empty($params['created_date'])) {
$params['created_date'] = date('YmdHis');
}
- if (!(CRM_Utils_Array::value('name', $params))) {
+ if (empty($params['name'])) {
$params['name'] = CRM_Utils_String::titleToVar($params['title'], 64);
}
*
* Generated from xml/schema/CRM/Campaign/Campaign.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c6ffa4ea926f3a52afc754bf44ef8586)
+ * (GenCodeChecksum:5f32f92aafb04b54f15a47d07a2fe105)
*/
/**
/**
* Unique Campaign ID.
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Campaign Type ID.Implicit FK to civicrm_option_value where option_group = campaign_type
*
- * @var int unsigned
+ * @var int
*/
public $campaign_type_id;
/**
* Campaign status ID.Implicit FK to civicrm_option_value where option_group = campaign_status
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* Optional parent id for this Campaign.
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
/**
* Is this Campaign enabled or disabled/cancelled?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* FK to civicrm_contact, who created this Campaign.
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* FK to civicrm_contact, who recently edited this Campaign.
*
- * @var int unsigned
+ * @var int
*/
public $last_modified_id;
'pseudoconstant' => [
'optionGroupName' => 'campaign_type',
'optionEditPath' => 'civicrm/admin/options/campaign_type',
- ]
+ ],
],
'status_id' => [
'name' => 'status_id',
'pseudoconstant' => [
'optionGroupName' => 'campaign_status',
'optionEditPath' => 'civicrm/admin/options/campaign_status',
- ]
+ ],
],
'external_identifier' => [
'name' => 'external_identifier',
'description' => ts('The target revenue for this campaign.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_campaign.goal_revenue',
'table_name' => 'civicrm_campaign',
*
* Generated from xml/schema/CRM/Campaign/CampaignGroup.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:9c9ee0c8ea79ddd0f680e8050693e5db)
+ * (GenCodeChecksum:c399857d6182b7d1dcc2f037518ba8c3)
*/
/**
/**
* Campaign Group id.
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to the activity Campaign.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* Entity id of referenced table.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'group_type' => [
'name' => 'group_type',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getCampaignGroupTypes',
- ]
+ ],
],
'entity_table' => [
'name' => 'entity_table',
*
* Generated from xml/schema/CRM/Campaign/Survey.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:bf281972fa5b1efaa8801eb9a47e42ae)
+ * (GenCodeChecksum:ad39991f1177492db1fd47cbaacf676a)
*/
/**
/**
* Survey id.
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to the Campaign.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* Implicit FK to civicrm_option_value where option_group = activity_type
*
- * @var int unsigned
+ * @var int
*/
public $activity_type_id;
/**
* Number of days for recurrence of release.
*
- * @var int unsigned
+ * @var int
*/
public $release_frequency;
/**
* Maximum number of contacts to allow for survey.
*
- * @var int unsigned
+ * @var int
*/
public $max_number_of_contacts;
/**
* Default number of contacts to allow for survey.
*
- * @var int unsigned
+ * @var int
*/
public $default_number_of_contacts;
/**
* Is this survey enabled or disabled/cancelled?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this default survey?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* FK to civicrm_contact, who created this Survey.
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* FK to civicrm_contact, who recently edited this Survey.
*
- * @var int unsigned
+ * @var int
*/
public $last_modified_id;
/**
* Used to store option group id.
*
- * @var int unsigned
+ * @var int
*/
public $result_id;
/**
* Bypass the email verification.
*
- * @var boolean
+ * @var bool
*/
public $bypass_confirm;
/**
* Can people share the petition through social media?
*
- * @var boolean
+ * @var bool
*/
public $is_share;
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'activity_type_id' => [
'name' => 'activity_type_id',
'pseudoconstant' => [
'optionGroupName' => 'activity_type',
'optionEditPath' => 'civicrm/admin/options/activity_type',
- ]
+ ],
],
'recontact_interval' => [
'name' => 'recontact_interval',
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
*/
class CRM_Campaign_Form_Search_Campaign extends CRM_Core_Form {
+ /**
+ * Explicitly declare the entity api name.
+ *
+ * @return string
+ */
+ public function getDefaultEntity() {
+ return 'Campaign';
+ }
+
/**
* Are we forced to run a search.
*
//campaign description.
$this->add('text', 'description', ts('Description'), $attributes['description']);
- //campaign start date.
- $this->addDate('start_date', ts('From'), FALSE, ['formatType' => 'searchDate']);
-
- //campaign end date.
- $this->addDate('end_date', ts('To'), FALSE, ['formatType' => 'searchDate']);
+ $this->add('datepicker', 'start_date', ts('Campaign Start Date'), [], FALSE, ['time' => FALSE]);
+ $this->add('datepicker', 'end_date', ts('Campaign End Date'), [], FALSE, ['time' => FALSE]);
//campaign type.
$campaignTypes = CRM_Campaign_PseudoConstant::campaignType();
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
'civicrm_phone.phone as phone',
'civicrm_contact.contact_type as contact_type',
'civicrm_contact.contact_sub_type as contact_sub_type',
- 't_act.activity_type_id',
- 'c_type.title as case_type',
+ 't_act.activity_type_id as activity_type_id',
'civicrm_case.case_type_id as case_type_id',
- 'cov_status.label as case_status',
- 'cov_status.label as case_status_name',
- 't_act.status_id',
+ 'civicrm_case.status_id as case_status_id',
+ 't_act.status_id as status_id',
'civicrm_case.start_date as case_start_date',
'case_relation_type.label_b_a as case_role',
+ 't_act.activity_date_time as activity_date_time',
+ 't_act.id as activity_id',
);
- if ($type == 'upcoming') {
- $selectClauses = array_merge($selectClauses, array(
- 't_act.desired_date as case_scheduled_activity_date',
- 't_act.id as case_scheduled_activity_id',
- 't_act.act_type_name as case_scheduled_activity_type_name',
- 't_act.act_type AS case_scheduled_activity_type',
- ));
- }
- elseif ($type == 'recent') {
- $selectClauses = array_merge($selectClauses, array(
- 't_act.desired_date as case_recent_activity_date',
- 't_act.id as case_recent_activity_id',
- 't_act.act_type_name as case_recent_activity_type_name',
- 't_act.act_type AS case_recent_activity_type',
- ));
- }
- elseif ($type == 'any') {
- $selectClauses = array_merge($selectClauses, array(
- 't_act.desired_date as case_activity_date',
- 't_act.id as case_activity_id',
- 't_act.act_type_name as case_activity_type_name',
- 't_act.act_type AS case_activity_type',
- ));
- }
-
$query = CRM_Contact_BAO_Query::appendAnyValueToSelect($selectClauses, 'case_id');
- $query .= " FROM civicrm_case
- INNER JOIN civicrm_case_contact ON civicrm_case.id = civicrm_case_contact.case_id
- INNER JOIN civicrm_contact ON civicrm_case_contact.contact_id = civicrm_contact.id ";
-
- if ($type == 'upcoming') {
- // This gets the earliest activity per case that's scheduled within 14 days from now.
- // Note we have an inner select to get the min activity id in order to remove duplicates in case there are two with the same datetime.
- // In this case we don't really care which one, so min(id) works.
- // optimized in CRM-11837
- $query .= " INNER JOIN
-(
- SELECT case_id, act.id, activity_date_time AS desired_date, activity_type_id, status_id, aov.name AS act_type_name, aov.label AS act_type
- FROM (
- SELECT *
- FROM (
- SELECT *
- FROM civicrm_view_case_activity_upcoming
- ORDER BY activity_date_time ASC, id ASC
- ) AS upcomingOrdered
- ) AS act
- LEFT JOIN civicrm_option_group aog ON aog.name='activity_type'
- LEFT JOIN civicrm_option_value aov ON ( aov.option_group_id = aog.id AND aov.value = act.activity_type_id )
-) AS t_act
-";
- }
- elseif ($type == 'recent') {
- // Similarly, the most recent activity in the past 14 days, and exclude scheduled.
- //improve query performance - CRM-10598
- $query .= " INNER JOIN
-(
- SELECT case_id, act.id, activity_date_time AS desired_date, activity_type_id, status_id, aov.name AS act_type_name, aov.label AS act_type
- FROM (
- SELECT *
- FROM (
- SELECT *
- FROM civicrm_view_case_activity_recent
- ORDER BY activity_date_time DESC, id ASC
- ) AS recentOrdered
- ) AS act
-LEFT JOIN civicrm_option_group aog ON aog.name='activity_type'
- LEFT JOIN civicrm_option_value aov ON ( aov.option_group_id = aog.id AND aov.value = act.activity_type_id )
-) AS t_act ";
- }
- elseif ($type == 'any') {
- $query .= " LEFT JOIN
-(
- SELECT ca4.case_id, act4.id AS id, act4.activity_date_time AS desired_date, act4.activity_type_id, act4.status_id, aov.name AS act_type_name, aov.label AS act_type
- FROM civicrm_activity act4
- LEFT JOIN civicrm_case_activity ca4
- ON ca4.activity_id = act4.id
- AND act4.is_current_revision = 1
- LEFT JOIN civicrm_option_group aog
- ON aog.name='activity_type'
- LEFT JOIN civicrm_option_value aov
- ON aov.option_group_id = aog.id
- AND aov.value = act4.activity_type_id
-) AS t_act";
- }
-
- $query .= "
- ON t_act.case_id = civicrm_case.id
- LEFT JOIN civicrm_phone ON (civicrm_phone.contact_id = civicrm_contact.id AND civicrm_phone.is_primary=1)
- LEFT JOIN civicrm_relationship case_relationship
- ON ( case_relationship.contact_id_a = civicrm_case_contact.contact_id AND case_relationship.contact_id_b = {$userID} AND case_relationship.is_active AND case_relationship.case_id = civicrm_case.id )
- LEFT JOIN civicrm_relationship_type case_relation_type
- ON ( case_relation_type.id = case_relationship.relationship_type_id
- AND case_relation_type.id = case_relationship.relationship_type_id )
-
- LEFT JOIN civicrm_case_type c_type
- ON civicrm_case.case_type_id = c_type.id
-
- LEFT JOIN civicrm_option_group cog_status
- ON cog_status.name = 'case_status'
-
- LEFT JOIN civicrm_option_value cov_status
- ON ( civicrm_case.status_id = cov_status.value
- AND cog_status.id = cov_status.option_group_id )
-";
+ $query .= <<<HERESQL
+ FROM civicrm_case
+ INNER JOIN civicrm_case_contact ON civicrm_case.id = civicrm_case_contact.case_id
+ INNER JOIN civicrm_contact ON civicrm_case_contact.contact_id = civicrm_contact.id
+HERESQL;
+
+ switch ($type) {
+ case 'upcoming':
+ case 'recent':
+ // civicrm_view_case_activity_upcoming and
+ // civicrm_view_case_activity_recent are views that show the next
+ // scheduled and most recent not-scheduled activity on each case,
+ // respectively.
+ $query .= <<<HERESQL
+ INNER JOIN civicrm_view_case_activity_$type t_act
+ ON t_act.case_id = civicrm_case.id
+HERESQL;
+ break;
+
+ case 'any':
+ $query .= <<<HERESQL
+ LEFT JOIN civicrm_case_activity ca4
+ ON civicrm_case.id = ca4.case_id
+ LEFT JOIN civicrm_activity t_act
+ ON t_act.id = ca4.activity_id
+ AND t_act.is_current_revision = 1
+HERESQL;
+ }
+
+ $query .= <<<HERESQL
+ LEFT JOIN civicrm_phone
+ ON civicrm_phone.contact_id = civicrm_contact.id
+ AND civicrm_phone.is_primary = 1
+ LEFT JOIN civicrm_relationship case_relationship
+ ON case_relationship.contact_id_a = civicrm_case_contact.contact_id
+ AND case_relationship.contact_id_b = {$userID}
+ AND case_relationship.is_active
+ AND case_relationship.case_id = civicrm_case.id
+ LEFT JOIN civicrm_relationship_type case_relation_type
+ ON case_relation_type.id = case_relationship.relationship_type_id
+ AND case_relation_type.id = case_relationship.relationship_type_id
+HERESQL;
if ($condition) {
// CRM-8749 backwards compatibility - callers of this function expect to start $condition with "AND"
}
$query .= " GROUP BY case_id ";
- if ($order) {
- $query .= $order;
- }
- else {
- if ($type == 'upcoming') {
- $query .= " ORDER BY case_scheduled_activity_date ASC ";
- }
- elseif ($type == 'recent') {
- $query .= " ORDER BY case_recent_activity_date ASC ";
- }
- elseif ($type == 'any') {
- $query .= " ORDER BY case_activity_date ASC ";
- }
- }
+ $query .= ($order) ?: ' ORDER BY activity_date_time ASC';
if ($limit) {
$query .= $limit;
$type = CRM_Utils_Array::value('type', $params, 'upcoming');
$userID = CRM_Core_Session::singleton()->get('userID');
- $caseActivityTypeColumn = 'case_activity_type_name';
- $caseActivityDateColumn = 'case_activity_date';
- $caseActivityIDColumn = 'case_activity_id';
- if ($type == 'upcoming') {
- $caseActivityDateColumn = 'case_scheduled_activity_date';
- $caseActivityTypeColumn = 'case_scheduled_activity_type';
- $caseActivityIDColumn = 'case_scheduled_activity_id';
- }
- elseif ($type == 'recent') {
- $caseActivityDateColumn = 'case_recent_activity_date';
- $caseActivityTypeColumn = 'case_recent_activity_type';
- $caseActivityIDColumn = 'case_recent_activity_id';
- }
-
// validate access for all cases.
if ($allCases && !CRM_Core_Permission::check('access all cases and activities')) {
$allCases = FALSE;
$order = NULL;
if (!empty($params['sortBy'])) {
if (strstr($params['sortBy'], 'date ')) {
- $params['sortBy'] = str_replace('date', $caseActivityDateColumn, $params['sortBy']);
+ $params['sortBy'] = str_replace('date', 'activity_date_time', $params['sortBy']);
}
$order = "ORDER BY " . $params['sortBy'];
}
$query = self::getCaseActivityQuery($type, $userID, $condition, $limit, $order);
$result = CRM_Core_DAO::executeQuery($query);
- $caseStatus = CRM_Core_OptionGroup::values('case_status', FALSE, FALSE, FALSE, " AND v.name = 'Urgent' ");
-
// we're going to use the usual actions, so doesn't make sense to duplicate definitions
$actions = CRM_Case_Selector_Search::links();
}
$mask = CRM_Core_Action::mask($permissions);
+ // Pseudoconstants to populate labels
+ $caseStatuses = CRM_Case_PseudoConstant::caseStatus('label', FALSE);
$caseTypes = CRM_Case_PseudoConstant::caseType('name');
+ $caseTypeTitles = CRM_Case_PseudoConstant::caseType('title', FALSE);
+ $activityTypeLabels = CRM_Activity_BAO_Activity::buildOptions('activity_type_id');
+
foreach ($result->fetchAll() as $case) {
$key = $case['case_id'];
$casesList[$key] = array();
$case['case_id']
);
$casesList[$key]['subject'] = $case['case_subject'];
- $casesList[$key]['case_status'] = in_array($case['case_status'], $caseStatus) ? sprintf('<strong>%s</strong>', strtoupper($case['case_status'])) : $case['case_status'];
- $casesList[$key]['case_type'] = $case['case_type'];
+ $casesList[$key]['case_status'] = CRM_Utils_Array::value($case['case_status_id'], $caseStatuses);
+ if ($case['case_status_id'] == CRM_Case_PseudoConstant::getKey('CRM_Case_BAO_Case', 'case_status_id', 'Urgent')) {
+ $casesList[$key]['case_status'] = sprintf('<strong>%s</strong>', strtoupper($casesList[$key]['case_status']));
+ }
+ $casesList[$key]['case_type'] = CRM_Utils_Array::value($case['case_type_id'], $caseTypeTitles);
$casesList[$key]['case_role'] = CRM_Utils_Array::value('case_role', $case, '---');
$casesList[$key]['manager'] = self::getCaseManagerContact($caseTypes[$case['case_type_id']], $case['case_id']);
- $casesList[$key]['date'] = $case[$caseActivityTypeColumn];
- if (($actId = CRM_Utils_Array::value('case_scheduled_activity_id', $case)) ||
- ($actId = CRM_Utils_Array::value('case_recent_activity_id', $case))
- ) {
+ $casesList[$key]['date'] = CRM_Utils_Array::value($case['activity_type_id'], $activityTypeLabels);
+ if ($actId = CRM_Utils_Array::value('activity_id', $case)) {
if (self::checkPermission($actId, 'view', $case['activity_type_id'], $userID)) {
if ($type == 'recent') {
$casesList[$key]['date'] = sprintf('<a class="action-item crm-hover-button" href="%s" title="%s">%s</a>',
- CRM_Utils_System::url('civicrm/case/activity/view', array('reset' => 1, 'cid' => $case['contact_id'], 'aid' => $case[$caseActivityIDColumn])),
+ CRM_Utils_System::url('civicrm/case/activity/view', array('reset' => 1, 'cid' => $case['contact_id'], 'aid' => $case['activity_id'])),
ts('View activity'),
- $case[$caseActivityTypeColumn]
+ CRM_Utils_Array::value($case['activity_type_id'], $activityTypeLabels)
);
}
else {
- $status = CRM_Utils_Date::overdue($case[$caseActivityDateColumn]) ? 'status-overdue' : 'status-scheduled';
+ $status = CRM_Utils_Date::overdue($case['activity_date_time']) ? 'status-overdue' : 'status-scheduled';
$casesList[$key]['date'] = sprintf('<a class="crm-popup %s" href="%s" title="%s">%s</a> ',
$status,
- CRM_Utils_System::url('civicrm/case/activity/view', array('reset' => 1, 'cid' => $case['contact_id'], 'aid' => $case[$caseActivityIDColumn])),
+ CRM_Utils_System::url('civicrm/case/activity/view', array('reset' => 1, 'cid' => $case['contact_id'], 'aid' => $case['activity_id'])),
ts('View activity'),
- $case[$caseActivityTypeColumn]
+ CRM_Utils_Array::value($case['activity_type_id'], $activityTypeLabels)
);
}
}
);
}
}
- $casesList[$key]['date'] .= "<br/>" . CRM_Utils_Date::customFormat($case[$caseActivityDateColumn]);
+ $casesList[$key]['date'] .= "<br/>" . CRM_Utils_Date::customFormat($case['activity_date_time']);
$casesList[$key]['links'] = CRM_Core_Action::formLink($actions['primaryActions'], $mask,
array(
'id' => $case['case_id'],
// Activity Status Label for Case activities list
$caseActivities[$caseActivityId]['status_id'] = CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_status_id', $dao->status);
+ $deleted = '';
+ if ($dao->deleted) {
+ $deleted = '<br /> ' . ts('(deleted)');
+ }
+ $caseActivities[$caseActivityId]['status_id'] = CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_status_id', $dao->status) . $deleted;
+ // if there are file attachments we will return how many
+ if (!empty($dao->attachment_ids)) {
+ $attachmentIDs = array_unique(explode(',', $dao->attachment_ids));
+ $caseActivity['no_attachments'] = count($attachmentIDs);
+ }
- $caseActivities[$caseActivityId]
- = self::addCaseActivityLinks($caseID, $contactID, $userID, $context, $dao, $caseActivities[$caseActivityId]);
+ $caseActivities[$caseActivityId]['links'] = self::addCaseActivityLinks($caseID, $contactID, $userID, $context, $dao);
}
$caseActivitiesDT = array();
* @param int $userID
* @param string $context
* @param \CRM_Core_DAO $dao
- * @param array $caseActivity
*
- * @return array caseActivity
+ * @return string
+ * HTML formatted Link
*/
- public static function addCaseActivityLinks($caseID, $contactID, $userID, $context, $dao, $caseActivity) {
+ private static function addCaseActivityLinks($caseID, $contactID, $userID, $context, $dao) {
// FIXME: Why are we not using CRM_Core_Action for these links? This is too much manual work and likely to get out-of-sync with core markup.
$caseActivityId = $dao->id;
$allowView = self::checkPermission($caseActivityId, 'view', $dao->activity_type_id, $userID);
}
elseif (!$caseDeleted) {
$url = ' <a ' . $css . ' href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>';
- $caseActivity['status_id'] = $caseActivity['status_id'] . '<br /> (deleted)';
}
//check for operations.
}
// if there are file attachments we will return how many and, if only one, add a link to it
if (!empty($dao->attachment_ids)) {
- $attachmentIDs = array_unique(explode(',', $dao->attachment_ids));
- $caseActivity['no_attachments'] = count($attachmentIDs);
$url .= implode(' ', CRM_Core_BAO_File::paperIconAttachment('civicrm_activity', $caseActivityId));
}
- $caseActivity['links'] = $url;
- return $caseActivity;
+
+ return $url;
}
/**
AND civicrm_case.is_deleted = {$cases['case_deleted']}";
$query = self::getCaseActivityQuery($type, $userID, $condition);
+ $activityTypes = CRM_Activity_BAO_Activity::buildOptions('activity_type_id');
$res = CRM_Core_DAO::executeQuery($query);
$activityInfo = array();
while ($res->fetch()) {
if ($type == 'upcoming') {
- $activityInfo[$res->case_id]['date'] = $res->case_scheduled_activity_date;
- $activityInfo[$res->case_id]['type'] = $res->case_scheduled_activity_type;
+ $activityInfo[$res->case_id]['date'] = $res->activity_date_time;
+ $activityInfo[$res->case_id]['type'] = CRM_Utils_Array::value($res->activity_type_id, $activityTypes);
}
else {
- $activityInfo[$res->case_id]['date'] = $res->case_recent_activity_date;
- $activityInfo[$res->case_id]['type'] = $res->case_recent_activity_type;
+ $activityInfo[$res->case_id]['date'] = $res->activity_date_time;
+ $activityInfo[$res->case_id]['type'] = CRM_Utils_Array::value($res->activity_type_id, $activityTypes);
}
}
//allow edit operation.
$allowEditNames = array('Open Case');
- if (CRM_Core_Permission::check('edit inbound email basic information') ||
- CRM_Core_Permission::check('edit inbound email basic information and content')
- ) {
+ if (CRM_Activity_BAO_Activity::checkEditInboundEmailsPermissions()) {
$allowEditNames[] = 'Inbound Email';
}
AS SELECT ca.case_id, a.id, a.activity_date_time, a.status_id, a.activity_type_id
FROM civicrm_case_activity ca
INNER JOIN civicrm_activity a ON ca.activity_id=a.id
- WHERE a.activity_date_time =
-(SELECT b.activity_date_time FROM civicrm_case_activity bca
+ WHERE a.id =
+(SELECT b.id FROM civicrm_case_activity bca
INNER JOIN civicrm_activity b ON bca.activity_id=b.id
WHERE b.activity_date_time <= DATE_ADD( NOW(), INTERVAL 14 DAY )
AND b.is_current_revision = 1 AND b.is_deleted=0 AND b.status_id = $scheduled_id
AS SELECT ca.case_id, a.id, a.activity_date_time, a.status_id, a.activity_type_id
FROM civicrm_case_activity ca
INNER JOIN civicrm_activity a ON ca.activity_id=a.id
- WHERE a.activity_date_time =
-(SELECT b.activity_date_time FROM civicrm_case_activity bca
+ WHERE a.id =
+(SELECT b.id FROM civicrm_case_activity bca
INNER JOIN civicrm_activity b ON bca.activity_id=b.id
WHERE b.activity_date_time >= DATE_SUB( NOW(), INTERVAL 14 DAY )
AND b.is_current_revision = 1 AND b.is_deleted=0 AND b.status_id <> $scheduled_id
*
* Generated from xml/schema/CRM/Case/Case.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a9960d56bc697d6cbc5347f9bc6a78bc)
+ * (GenCodeChecksum:f7d3f0df9ce94aec00f5eb0e20cedd1e)
*/
/**
/**
* Unique Case ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_case_type.id
*
- * @var int unsigned
+ * @var int
*/
public $case_type_id;
/**
* Id of case status.
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_deleted;
'table' => 'civicrm_case_type',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'case_subject' => [
'name' => 'subject',
'pseudoconstant' => [
'optionGroupName' => 'case_status',
'optionEditPath' => 'civicrm/admin/options/case_status',
- ]
+ ],
],
'case_deleted' => [
'name' => 'is_deleted',
*
* Generated from xml/schema/CRM/Case/CaseActivity.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:fd04fd5686de74febc915b1a035a3fb5)
+ * (GenCodeChecksum:cb7a73ba739c93a482d18ef28ed0c589)
*/
/**
/**
* Unique case-activity association id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Case ID of case-activity association.
*
- * @var int unsigned
+ * @var int
*/
public $case_id;
/**
* Activity ID of case-activity association.
*
- * @var int unsigned
+ * @var int
*/
public $activity_id;
*
* Generated from xml/schema/CRM/Case/CaseContact.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ff0a0c29f836177de2ac856be6c5cb15)
+ * (GenCodeChecksum:84dae97091e4a1612c67274f5cb10531)
*/
/**
/**
* Unique case-contact association id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Case ID of case-contact association.
*
- * @var int unsigned
+ * @var int
*/
public $case_id;
/**
* Contact ID of contact record given case belongs to.
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
*
* Generated from xml/schema/CRM/Case/CaseType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:9ebd07607858eaf185b2be32744267bb)
+ * (GenCodeChecksum:317907ffe519c3f3eab8af9d8e9e1f7f)
*/
/**
/**
* Autoincremented type id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this entry active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this case type a predefined system type?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
}
// store the submitted values in an array
- $params = $this->controller->exportValues($this->_name);
+ // Explanation for why we only check the is_unittest element: Prior to adding that check, there was no check and so any $params passed in would have been overwritten. Just in case somebody is passing in some non-null params and that broken code would have inadvertently been working, we can maintain backwards compatibility by only checking for the is_unittest parameter, and so that broken code will still work. At the same time this allows unit tests to pass in a $params without it getting overwritten. See also PR #2077 for some discussion of when the $params parameter was added as a passed in variable.
+ if (empty($params['is_unittest'])) {
+ $params = $this->controller->exportValues($this->_name);
+ }
//set parent id if its edit mode
if ($parentId = CRM_Utils_Array::value('parent_id', $this->_defaults)) {
public static function beginPostProcess(&$form, &$params) {
$params['id'] = CRM_Utils_Array::value('case_id', $params);
- if ($params['updateLinkedCases'] === '1') {
+ if (CRM_Utils_Array::value('updateLinkedCases', $params) === '1') {
$caseID = CRM_Utils_Array::first($form->_caseId);
$cases = CRM_Case_BAO_Case::getRelatedCases($caseID);
'type' => 'upload',
'name' => ts('Save and New'),
'subName' => 'new',
- 'submitOnce' => TRUE,
],
[
'type' => 'cancel',
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
/**
* Prefix for the controller
- * @var sting
+ * @var string
*/
protected $_prefix = 'case_';
* Are we operating in "single mode", i.e. deleting one
* specific case?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we moving case to Trash.
*
- * @var boolean
+ * @var bool
*/
public $_moveToTrash = TRUE;
* Are we operating in "single mode", i.e. deleting one
* specific case?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
$isDeleted = FALSE;
if ($result->case_deleted) {
$isDeleted = TRUE;
- $row['case_status_id'] = empty($row['case_status_id']) ? "" : $row['case_status_id'] . '<br />(deleted)';
+ $row['case_status_id'] = empty($row['case_status_id']) ? "" : $row['case_status_id'] . '<br />' . ts('(deleted)');
}
$scheduledInfo['case_id'][] = $result->case_id;
/**
* The default variable defined.
*
- * @var boolean
+ * @var bool
*/
protected $_isRedact;
protected $xml = [];
/**
- * @var array|NULL
+ * @var array|null
*/
protected $hookCache = NULL;
/**
- * @var array|NULL symbolic names of case-types
+ * Symbolic names of case-types.
+ *
+ * @var array|null
*/
protected $allCaseTypes = NULL;
return $contact;
}
+ if (!empty($params['contact_id']) && empty($params['contact_type'])) {
+ $params['contact_type'] = self::getContactType($params['contact_id']);
+ }
+
$isEdit = TRUE;
if ($invokeHooks) {
if (!empty($params['contact_id'])) {
* @return array
* Contact details
*/
- public static function getHierContactDetails($contactId, &$fields) {
+ public static function getHierContactDetails($contactId, $fields) {
$params = array(array('contact_id', '=', $contactId, 0, 0));
$options = array();
*/
public static function formatProfileContactParams(
&$params,
- &$fields,
+ $fields,
$contactID = NULL,
$ufGroupId = NULL,
$ctype = NULL,
$inputLF = CRM_Utils_Array::value(2, $input);
$check = self::generateChecksum($contactID, $inputTS, $inputLF);
-
- if (!hash_equals($check, $inputCheck)) {
+ // Joomla_11 - If $inputcheck is null without explicitly casting to a string
+ // you get an error.
+ if (!hash_equals($check, (string) $inputCheck)) {
return FALSE;
}
/**
* Are we in search mode.
*
- * @var boolean
+ * @var bool
*/
public $_search = TRUE;
/**
* Should we skip permission checking.
*
- * @var boolean
+ * @var bool
*/
public $_skipPermission = FALSE;
/**
* Should we skip adding of delete clause.
*
- * @var boolean
+ * @var bool
*/
public $_skipDeleteClause = FALSE;
/**
* Are we in strict mode (use equality over LIKE)
*
- * @var boolean
+ * @var bool
*/
public $_strict = FALSE;
/**
* Should we only search on primary location.
*
- * @var boolean
+ * @var bool
*/
public $_primaryLocation = TRUE;
/**
* Are contact ids part of the query.
*
- * @var boolean
+ * @var bool
*/
public $_includeContactIds = FALSE;
/**
* Should we use the smart group cache.
*
- * @var boolean
+ * @var bool
*/
public $_smartGroupCache = TRUE;
* Should we enable the distinct clause, used if we are including
* more than one group
*
- * @var boolean
+ * @var bool
*/
public $_useDistinct = FALSE;
*/
protected $_rangeCache = [];
/**
- * Set to true when $this->relationship is run to avoid adding twice
- * @var Boolean
+ * Set to true when $this->relationship is run to avoid adding twice.
+ *
+ * @var bool
*/
protected $_relationshipValuesAdded = FALSE;
/**
- * Set to the name of the temp table if one has been created
- * @var String
+ * Set to the name of the temp table if one has been created.
+ *
+ * @var string
*/
public static $_relationshipTempTable = NULL;
if (array_key_exists('civicrm_membership', $this->_whereTables)) {
$component = 'membership';
}
- if (isset($component)) {
- // @todo should be if (isset($component && !$this->_skipPermission)
+ if (isset($component) && !$this->_skipPermission) {
+ // Unit test coverage in api_v3_FinancialTypeACLTest::testGetACLContribution.
CRM_Financial_BAO_FinancialType::buildPermissionedClause($this->_whereClause, $component);
}
$regularGroupIDs[] = trim($id);
}
}
+ $hasNonSmartGroups = count($regularGroupIDs);
$isNotOp = ($op == 'NOT IN' || $op == '!=');
- $statii = [];
- $gcsValues = $this->getWhereValues('group_contact_status', $grouping);
- if ($gcsValues &&
- is_array($gcsValues[2])
- ) {
- foreach ($gcsValues[2] as $k => $v) {
- if ($v) {
- $statii[] = "'" . CRM_Utils_Type::escape($k, 'String') . "'";
- }
- }
- }
- else {
- $statii[] = "'Added'";
- }
+ $statusJoinClause = $this->getGroupStatusClause($grouping);
$groupClause = [];
- if (count($regularGroupIDs) || empty($value)) {
+ if ($hasNonSmartGroups || empty($value)) {
// include child groups IDs if any
$childGroupIds = (array) CRM_Contact_BAO_Group::getChildGroupIds($regularGroupIDs);
foreach ($childGroupIds as $key => $id) {
}
$groupClause[] = "( {$clause} )";
- if ($statii) {
- $joinClause[] = "{$gcTable}.status IN (" . implode(', ', $statii) . ")";
+ if ($statusJoinClause) {
+ $joinClause[] = "{$gcTable}.$statusJoinClause";
}
$this->_tables[$gcTable] = $this->_whereTables[$gcTable] = " LEFT JOIN civicrm_group_contact {$gcTable} ON (" . implode(' AND ', $joinClause) . ")";
}
list($qillop, $qillVal) = CRM_Contact_BAO_Query::buildQillForFieldValue('CRM_Contact_DAO_Group', 'id', $value, $op);
$this->_qill[$grouping][] = ts("Group(s) %1 %2", [1 => $qillop, 2 => $qillVal]);
if (strpos($op, 'NULL') === FALSE) {
- $this->_qill[$grouping][] = ts("Group Status %1", [1 => implode(' ' . ts('or') . ' ', $statii)]);
+ $this->_qill[$grouping][] = ts("Group Status %1", [1 => implode(' ' . ts('or') . ' ', $this->getSelectedGroupStatuses($grouping))]);
}
}
];
}
+ /**
+ * Get the clause for group status.
+ *
+ * @param int $grouping
+ *
+ * @return string
+ */
+ protected function getGroupStatusClause($grouping) {
+ $statuses = $this->getSelectedGroupStatuses($grouping);
+ return "status IN (" . implode(', ', $statuses) . ")";
+ }
+
+ /**
+ * Get an array of the statuses that have been selected.
+ *
+ * @param string $grouping
+ *
+ * @return array
+ */
+ protected function getSelectedGroupStatuses($grouping) {
+ $statuses = [];
+ $gcsValues = $this->getWhereValues('group_contact_status', $grouping);
+ if ($gcsValues &&
+ is_array($gcsValues[2])
+ ) {
+ foreach ($gcsValues[2] as $k => $v) {
+ if ($v) {
+ $statuses[] = "'" . CRM_Utils_Type::escape($k, 'String') . "'";
+ }
+ }
+ }
+ else {
+ $statuses[] = "'Added'";
+ }
+ return $statuses;
+ }
+
}
*/
public static function getdefaults() {
return array(
- 'is_active' => 0,
+ 'is_active' => 1,
'is_permission_a_b' => self::NONE,
'is_permission_b_a' => self::NONE,
'description' => '',
*
* Generated from xml/schema/CRM/Contact/ACLContactCache.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ab40fa26e037ef4897359d3c288d42b8)
+ * (GenCodeChecksum:8bc987e1284d464f9b475686d9dc32a2)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_contact (could be null for anon user)
*
- * @var int unsigned
+ * @var int
*/
public $user_id;
/**
* FK to civicrm_contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
],
'pseudoconstant' => [
'callback' => 'CRM_ACL_BAO_ACL::operation',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Contact/Contact.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:653579cbfa509d67ae7a39c78dd27bf2)
+ * (GenCodeChecksum:e2181ea97a3e309b7e74b636757b6aac)
*/
/**
/**
* Unique Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
public $contact_sub_type;
/**
- * @var boolean
+ * @var bool
*/
public $do_not_email;
/**
- * @var boolean
+ * @var bool
*/
public $do_not_phone;
/**
- * @var boolean
+ * @var bool
*/
public $do_not_mail;
/**
- * @var boolean
+ * @var bool
*/
public $do_not_sms;
/**
- * @var boolean
+ * @var bool
*/
public $do_not_trade;
/**
* Has the contact opted out from receiving all bulk email from the organization or site domain?
*
- * @var boolean
+ * @var bool
*/
public $is_opt_out;
/**
* Prefix or Title for name (Ms, Mr...). FK to prefix ID
*
- * @var int unsigned
+ * @var int
*/
public $prefix_id;
/**
* Suffix for name (Jr, Sr...). FK to suffix ID
*
- * @var int unsigned
+ * @var int
*/
public $suffix_id;
/**
* Communication style (e.g. formal vs. familiar) to use with this contact. FK to communication styles in civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $communication_style_id;
/**
* FK to civicrm_option_value.id, that has to be valid registered Email Greeting.
*
- * @var int unsigned
+ * @var int
*/
public $email_greeting_id;
/**
* FK to civicrm_option_value.id, that has to be valid registered Postal Greeting.
*
- * @var int unsigned
+ * @var int
*/
public $postal_greeting_id;
/**
* FK to civicrm_option_value.id, that has to be valid registered Addressee.
*
- * @var int unsigned
+ * @var int
*/
public $addressee_id;
/**
* FK to gender ID
*
- * @var int unsigned
+ * @var int
*/
public $gender_id;
public $birth_date;
/**
- * @var boolean
+ * @var bool
*/
public $is_deceased;
/**
* Optional FK to Primary Contact for this household.
*
- * @var int unsigned
+ * @var int
*/
public $primary_contact_id;
/**
* OPTIONAL FK to civicrm_contact record.
*
- * @var int unsigned
+ * @var int
*/
public $employer_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_deleted;
'keyColumn' => 'name',
'labelColumn' => 'label',
'condition' => 'parent_id IS NULL',
- ]
+ ],
],
'contact_sub_type' => [
'name' => 'contact_sub_type',
'keyColumn' => 'name',
'labelColumn' => 'label',
'condition' => 'parent_id IS NOT NULL',
- ]
+ ],
],
'do_not_email' => [
'name' => 'do_not_email',
'name' => 'legal_identifier',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Legal Identifier'),
- 'description' => ts('May be used for SSN, EIN/TIN, Household ID (census) or other applicable unique legal/government ID.
- '),
+ 'description' => ts('May be used for SSN, EIN/TIN, Household ID (census) or other applicable unique legal/government ID.'),
'maxlength' => 32,
'size' => CRM_Utils_Type::MEDIUM,
'import' => TRUE,
'pseudoconstant' => [
'optionGroupName' => 'preferred_communication_method',
'optionEditPath' => 'civicrm/admin/options/preferred_communication_method',
- ]
+ ],
],
'preferred_language' => [
'name' => 'preferred_language',
'optionGroupName' => 'languages',
'keyColumn' => 'name',
'optionEditPath' => 'civicrm/admin/options/languages',
- ]
+ ],
],
'preferred_mail_format' => [
'name' => 'preferred_mail_format',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::pmf',
- ]
+ ],
],
'hash' => [
'name' => 'hash',
'maxlength' => 32,
'size' => CRM_Utils_Type::MEDIUM,
'where' => 'civicrm_contact.api_key',
+ 'protected' => 'true',
'table_name' => 'civicrm_contact',
'entity' => 'Contact',
'bao' => 'CRM_Contact_BAO_Contact',
'pseudoconstant' => [
'optionGroupName' => 'individual_prefix',
'optionEditPath' => 'civicrm/admin/options/individual_prefix',
- ]
+ ],
],
'suffix_id' => [
'name' => 'suffix_id',
'pseudoconstant' => [
'optionGroupName' => 'individual_suffix',
'optionEditPath' => 'civicrm/admin/options/individual_suffix',
- ]
+ ],
],
'formal_title' => [
'name' => 'formal_title',
'pseudoconstant' => [
'optionGroupName' => 'communication_style',
'optionEditPath' => 'civicrm/admin/options/communication_style',
- ]
+ ],
],
'email_greeting_id' => [
'name' => 'email_greeting_id',
'pseudoconstant' => [
'optionGroupName' => 'email_greeting',
'optionEditPath' => 'civicrm/admin/options/email_greeting',
- ]
+ ],
],
'email_greeting_custom' => [
'name' => 'email_greeting_custom',
'pseudoconstant' => [
'optionGroupName' => 'postal_greeting',
'optionEditPath' => 'civicrm/admin/options/postal_greeting',
- ]
+ ],
],
'postal_greeting_custom' => [
'name' => 'postal_greeting_custom',
'pseudoconstant' => [
'optionGroupName' => 'addressee',
'optionEditPath' => 'civicrm/admin/options/addressee',
- ]
+ ],
],
'addressee_custom' => [
'name' => 'addressee_custom',
'pseudoconstant' => [
'optionGroupName' => 'gender',
'optionEditPath' => 'civicrm/admin/options/gender',
- ]
+ ],
],
'birth_date' => [
'name' => 'birth_date',
*
* Generated from xml/schema/CRM/Contact/ContactType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ab123a55d492c003df354c32e8b9863c)
+ * (GenCodeChecksum:adba53a6a4d64ba498d7e36b03c0f968)
*/
/**
/**
* Contact Type ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Optional FK to parent contact type.
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
/**
* Is this entry active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this contact type a predefined system type
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
'keyColumn' => 'id',
'labelColumn' => 'label',
'condition' => 'parent_id IS NULL',
- ]
+ ],
],
'is_active' => [
'name' => 'is_active',
*
* Generated from xml/schema/CRM/Contact/DashboardContact.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f9be53bdf3d5151edf77e9b9f9004571)
+ * (GenCodeChecksum:2adb5645722410e9059da0a345a0a30b)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Dashboard ID
*
- * @var int unsigned
+ * @var int
*/
public $dashboard_id;
/**
* Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* column no for this widget
*
- * @var boolean
+ * @var bool
*/
public $column_no;
/**
* Is this widget active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
*
* Generated from xml/schema/CRM/Contact/Group.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:48373e283a62b36aa59ac812f8cb4134)
+ * (GenCodeChecksum:28c32e7038a2b7aa7ca2c45117660974)
*/
/**
/**
* Group ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to saved search table.
*
- * @var int unsigned
+ * @var int
*/
public $saved_search_id;
/**
* Is this entry active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this group hidden?
*
- * @var boolean
+ * @var bool
*/
public $is_hidden;
/**
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* FK to contact table.
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* FK to contact table.
*
- * @var int unsigned
+ * @var int
*/
public $modified_id;
'entity' => 'Group',
'bao' => 'CRM_Contact_BAO_Group',
'localizable' => 1,
+ 'html' => [
+ 'type' => 'Text',
+ ],
],
'description' => [
'name' => 'description',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::groupVisibility',
- ]
+ ],
],
'where_clause' => [
'name' => 'where_clause',
'pseudoconstant' => [
'optionGroupName' => 'group_type',
'optionEditPath' => 'civicrm/admin/options/group_type',
- ]
+ ],
],
'cache_date' => [
'name' => 'cache_date',
'serialize' => self::SERIALIZE_COMMA,
'pseudoconstant' => [
'callback' => 'CRM_Core_PseudoConstant::allGroup',
- ]
+ ],
],
'children' => [
'name' => 'children',
*
* Generated from xml/schema/CRM/Contact/GroupContact.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1d229cf09854f6b9a9991a0c0bd86c87)
+ * (GenCodeChecksum:abb2a96c7fd72f93619b605fbb11b4b5)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_group
*
- * @var int unsigned
+ * @var int
*/
public $group_id;
/**
* FK to civicrm_contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Optional location to associate with this membership
*
- * @var int unsigned
+ * @var int
*/
public $location_id;
/**
* Optional email to associate with this membership
*
- * @var int unsigned
+ * @var int
*/
public $email_id;
'table' => 'civicrm_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'contact_id' => [
'name' => 'contact_id',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::groupContactStatus',
- ]
+ ],
],
'location_id' => [
'name' => 'location_id',
*
* Generated from xml/schema/CRM/Contact/GroupContactCache.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:98cff858204d34551eec0b9bee6e24af)
+ * (GenCodeChecksum:217f20fad2d47f50e3a9c43b62df2c17)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_group
*
- * @var int unsigned
+ * @var int
*/
public $group_id;
/**
* FK to civicrm_contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
'table' => 'civicrm_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'contact_id' => [
'name' => 'contact_id',
*
* Generated from xml/schema/CRM/Contact/GroupNesting.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:dcf20d8789668c4542bc0c5d5faa1e8e)
+ * (GenCodeChecksum:2559ff6c3da8f02b147577a6d4e26004)
*/
/**
/**
* Relationship ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* ID of the child group
*
- * @var int unsigned
+ * @var int
*/
public $child_group_id;
/**
* ID of the parent group
*
- * @var int unsigned
+ * @var int
*/
public $parent_group_id;
*
* Generated from xml/schema/CRM/Contact/GroupOrganization.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4234ea5a60e2a053e2de768a10cb1488)
+ * (GenCodeChecksum:00717d9edb0719d380b5fd7c3e91bc74)
*/
/**
/**
* Relationship ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* ID of the group
*
- * @var int unsigned
+ * @var int
*/
public $group_id;
/**
* ID of the Organization Contact
*
- * @var int unsigned
+ * @var int
*/
public $organization_id;
'table' => 'civicrm_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'organization_id' => [
'name' => 'organization_id',
*
* Generated from xml/schema/CRM/Contact/Relationship.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0722d901c4eac4e462bc7de9887e605a)
+ * (GenCodeChecksum:ebfcea88ae4bd09a0821a942ecdfa4db)
*/
/**
/**
* Relationship ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* id of the first contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id_a;
/**
* id of the second contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id_b;
/**
* id of the relationship
*
- * @var int unsigned
+ * @var int
*/
public $relationship_type_id;
/**
* is the relationship active ?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Permission that Contact A has to view/update Contact B
*
- * @var int unsigned
+ * @var int
*/
public $is_permission_a_b;
/**
* Permission that Contact B has to view/update Contact A
*
- * @var int unsigned
+ * @var int
*/
public $is_permission_b_a;
/**
* FK to civicrm_case
*
- * @var int unsigned
+ * @var int
*/
public $case_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getPermissionedRelationshipOptions',
- ]
+ ],
],
'is_permission_b_a' => [
'name' => 'is_permission_b_a',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getPermissionedRelationshipOptions',
- ]
+ ],
],
'case_id' => [
'name' => 'case_id',
*
* Generated from xml/schema/CRM/Contact/RelationshipType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:9fa07d6d85caa27a637694324ea5b740)
+ * (GenCodeChecksum:78a8cea89e73b1a409f7908ad08cf99e)
*/
/**
/**
* Primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this relationship type a predefined system type (can not be changed or de-activated)?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this relationship type currently active (i.e. can be used when creating or editing relationships)?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
'keyColumn' => 'name',
'labelColumn' => 'label',
'condition' => 'parent_id IS NULL',
- ]
+ ],
],
'contact_type_b' => [
'name' => 'contact_type_b',
'keyColumn' => 'name',
'labelColumn' => 'label',
'condition' => 'parent_id IS NULL',
- ]
+ ],
],
'contact_sub_type_a' => [
'name' => 'contact_sub_type_a',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Contact Subtype A'),
- 'description' => ts('If defined, contact_sub_type_a in a relationship of this type must be a specific contact_sub_type.
- '),
+ 'description' => ts('If defined, contact_sub_type_a in a relationship of this type must be a specific contact_sub_type.'),
'maxlength' => 64,
'size' => CRM_Utils_Type::BIG,
'where' => 'civicrm_relationship_type.contact_sub_type_a',
'keyColumn' => 'name',
'labelColumn' => 'label',
'condition' => 'parent_id IS NOT NULL',
- ]
+ ],
],
'contact_sub_type_b' => [
'name' => 'contact_sub_type_b',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Contact Subtype B'),
- 'description' => ts('If defined, contact_sub_type_b in a relationship of this type must be a specific contact_sub_type.
- '),
+ 'description' => ts('If defined, contact_sub_type_b in a relationship of this type must be a specific contact_sub_type.'),
'maxlength' => 64,
'size' => CRM_Utils_Type::BIG,
'where' => 'civicrm_relationship_type.contact_sub_type_b',
'keyColumn' => 'name',
'labelColumn' => 'label',
'condition' => 'parent_id IS NOT NULL',
- ]
+ ],
],
'is_reserved' => [
'name' => 'is_reserved',
'name' => 'is_active',
'type' => CRM_Utils_Type::T_BOOLEAN,
'title' => ts('Relationship Type is Active'),
- 'description' => ts('Is this relationship type currently active (i.e. can be used when creating or editing relationships)?
- '),
+ 'description' => ts('Is this relationship type currently active (i.e. can be used when creating or editing relationships)?'),
'where' => 'civicrm_relationship_type.is_active',
'default' => '1',
'table_name' => 'civicrm_relationship_type',
*
* Generated from xml/schema/CRM/Contact/SavedSearch.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ff337d9810d6c4d6225f77b6b3007729)
+ * (GenCodeChecksum:556322817dc9b7b9dab015e1f0179fb7)
*/
/**
/**
* Saved Search ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to civicrm_mapping used for saved search-builder searches.
*
- * @var int unsigned
+ * @var int
*/
public $mapping_id;
/**
* Foreign key to civicrm_option value table used for saved custom searches.
*
- * @var int unsigned
+ * @var int
*/
public $search_custom_id;
*
* Generated from xml/schema/CRM/Contact/SubscriptionHistory.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8051a666011690a9dfb14d91a013a3e0)
+ * (GenCodeChecksum:af7ac35767e88f1dd090f54ab44c3b35)
*/
/**
/**
* Internal Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Contact Id
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Group Id
*
- * @var int unsigned
+ * @var int
*/
public $group_id;
'table' => 'civicrm_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'date' => [
'name' => 'date',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getSubscriptionHistoryMethods',
- ]
+ ],
],
'status' => [
'name' => 'status',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::groupContactStatus',
- ]
+ ],
],
'tracking' => [
'name' => 'tracking',
);
$this->addField('used', ['label' => ts('Usage')], TRUE);
- $disabled = [];
$reserved = $this->addField('is_reserved', ['label' => ts('Reserved?')]);
if (!empty($this->_defaults['is_reserved'])) {
$reserved->freeze();
}
$attributes = ['class' => 'two'];
- if (!empty($disabled)) {
- $attributes = array_merge($attributes, $disabled);
- }
for ($count = 0; $count < self::RULES_COUNT; $count++) {
$this->add('select', "where_$count", ts('Field'),
- [
- NULL => ts('- none -'),
- ] + $this->_fields, FALSE, $disabled
+ $this->_fields, FALSE, ['class' => 'crm-select2', 'placeholder' => ts('Select Field')]
);
$this->addField("length_$count", ['entity' => 'Rule', 'name' => 'rule_length'] + $attributes);
$this->addField("weight_$count", ['entity' => 'Rule', 'name' => 'rule_weight'] + $attributes);
/**
* The profile group id used for display.
*
- * @var integer
+ * @var int
*/
protected $_ufGroupID;
public static $csv = ['contact_type', 'group', 'tag'];
/**
- * @var string how to display the results. Should we display as
- * contributons, members, cases etc
+ * How to display the results. Should we display as contributons, members, cases etc.
+ *
+ * @var string
*/
protected $_componentMode;
/**
- * @var string what operator should we use, AND or OR
+ * What operator should we use, AND or OR.
+ *
+ * @var string
*/
protected $_operator;
const LIMIT = 10;
/**
- * @var array CRM_Contact_Form_Search_Custom_FullText_AbstractPartialQuery
+ * @var CRM_Contact_Form_Search_Custom_FullText_AbstractPartialQuery[]
*/
protected $_partialQueries = NULL;
protected $_tableFields = NULL;
/**
- * @var array|null NULL if no limit; or array(0 => $limit, 1 => $offset)
+ * Limit clause.
+ *
+ * NULL if no limit; or array(0 => $limit, 1 => $offset).
+ *
+ * @var array|null
*/
protected $_limitClause = NULL;
/**
- * @var array|null NULL if no limit; or array(0 => $limit, 1 => $offset)
+ * Limit row clause.
+ *
+ * NULL if no limit; or array(0 => $limit, 1 => $offset)
+ *
+ * @var array|null
*/
protected $_limitRowClause = NULL;
/**
- * @var array|null NULL if no limit; or array(0 => $limit, 1 => $offset)
+ * Limit detail clause.
+ *
+ * NULL if no limit; or array(0 => $limit, 1 => $offset).
+ *
+ * @var array|null
*/
protected $_limitDetailClause = NULL;
protected $_limitNumber = 10;
+
/**
- * this should be one more than self::LIMIT
+ * This should be one more than self::LIMIT.
+ *
* @var int
*/
protected $_limitNumberPlus1 = 11;
}
public function buildTempTable() {
- $table = CRM_Utils_SQL_TempTable::build()->setCategory('custom')->setMemory()->setUtf8();
+ $table = CRM_Utils_SQL_TempTable::build()->setCategory('custom')->setMemory();
$this->_tableName = $table->getName();
$this->_tableFields = [
";
$table->createWithColumns($sql);
- $entityIdTable = CRM_Utils_SQL_TempTable::build()->setCategory('custom')->setMemory()->setUtf8();
+ $entityIdTable = CRM_Utils_SQL_TempTable::build()->setCategory('custom')->setMemory();
$this->_entityIDTableName = $entityIdTable->getName();
$sql = "
id int unsigned NOT NULL AUTO_INCREMENT,
/**
* @param int $offset
* @param int $rowcount
- * @param NULL $sort
+ * @param string $sort
* @param bool $includeContactIDs
* @param bool $justIDs
*
* @return string
+ * @throws \Exception
*/
public function all(
$offset = 0, $rowcount = 0, $sort = NULL,
/**
* @param int $offset
* @param int $rowcount
- * @param NULL $sort
+ * @param string $sort
* @param bool $returnSQL
*
* @return string
+ * @throws \Exception
*/
public function contactIDs($offset = 0, $rowcount = 0, $sort = NULL, $returnSQL = FALSE) {
return $this->all($offset, $rowcount, $sort, FALSE, TRUE);
$form->assign('taskName', CRM_Utils_Array::value($form->_task, $crmContactTaskTasks));
if ($useTable) {
- $tempTable = CRM_Utils_SQL_TempTable::build()->setCategory('tskact')->setDurable()->setId($qfKey)->setUtf8();
+ $tempTable = CRM_Utils_SQL_TempTable::build()->setCategory('tskact')->setDurable()->setId($qfKey);
$form->_componentTable = $tempTable->getName();
$tempTable->drop();
$tempTable->createWithColumns('contact_id int primary key');
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
*
* Single mode means sending email to one specific contact.
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_noEmails = FALSE;
* Are we operating in "single mode", i.e. mapping address to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
* Are we operating in "single mode", i.e. sending sms to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
}
// Get Task name
- $modeValue = CRM_Contact_Form_Search::getModeValue($values['component_mode']);
+ $modeValue = CRM_Contact_Form_Search::getModeValue(CRM_Utils_Array::value('component_mode', $values, CRM_Contact_BAO_Query::MODE_CONTACTS));
$className = $modeValue['taskClassName'];
$taskList = $className::taskTitles();
$this->_task = CRM_Utils_Array::value('task', $values);
/**
* Is this field required
- * @var boolean
+ * @var bool
*/
public $_required;
$result = CRM_Core_DAO::executeQuery($query, array($database));
$incompleteImportTables = array();
while ($importTable = $result->fetch()) {
- if (!$this->isComplete($importTable)) {
+ if (!self::isComplete($importTable)) {
$incompleteImportTables[] = $importTable;
}
}
/**
* Total number of lines in file
*
- * @var integer
+ * @var int
*/
protected $_rowCount;
/**
* Running total number of un-matched Contacts.
+ *
* @var int
*/
protected $_unMatchCount;
/**
- * Array of unmatched lines
+ * Array of unmatched lines.
+ *
* @var array
*/
protected $_unMatch;
protected $_primaryKeyName;
protected $_statusFieldName;
+ protected $fieldMetadata = [];
/**
* On duplicate
*
}
if (!$break) {
- $this->formatContactParameters($value, $formatted);
+ if (!empty($value['location_type_id'])) {
+ $this->formatLocationBlock($value, $formatted);
+ }
+ else {
+ CRM_Core_Error::deprecatedFunctionWarning('this is not expected to be reachable now');
+ $this->formatContactParameters($value, $formatted);
+ }
}
}
if (!$isAddressCustomField) {
// get the formatted location blocks into params - w/ 3.0 format, CRM-4605
if (!empty($values['location_type_id'])) {
- return $this->formatLocationBlock($values, $params, $fields);
+ CRM_Core_Error::deprecatedFunctionWarning('this is not expected to be reachable now');
+ return $this->formatLocationBlock($values, $params);
}
if (isset($values['note'])) {
*
* @param array $values
* @param array $params
- * @param array $fields
*
* @return bool
*/
- protected function formatLocationBlock(&$values, &$params, $fields) {
- if (empty($values['location_type_id'])) {
- return FALSE;
- }
+ protected function formatLocationBlock(&$values, &$params) {
$blockTypes = [
'phone' => 'Phone',
'email' => 'Email',
$params[$blockFieldName] = [];
}
- if (!array_key_exists($block, $fields)) {
- $className = "CRM_Core_DAO_$block";
- $fields[$block] = $className::fields();
- }
-
- $blockCnt = count($params[$blockFieldName]);
+ $fields[$block] = $this->getMetadataForEntity($block);
// copy value to dao field name.
if ($blockFieldName == 'im') {
}
_civicrm_api3_store_values($fields[$block], $values,
- $params[$blockFieldName][++$blockCnt]
+ $params[$blockFieldName][$values['location_type_id']]
);
- if ($values['location_type_id'] === 'Primary') {
- if (!empty($params['id'])) {
- $primary = civicrm_api3($block, 'get', [
- 'return' => 'location_type_id',
- 'contact_id' => $params['id'],
- 'is_primary' => 1,
- 'sequential' => 1
- ]);
- }
- $defaultLocationType = CRM_Core_BAO_LocationType::getDefault();
- $values['location_type_id'] = (isset($primary) && $primary['count']) ? $primary['values'][0]['location_type_id'] : $defaultLocationType->id;
- $values['is_primary'] = 1;
- }
+ $this->fillPrimary($params[$blockFieldName][$values['location_type_id']], $values, $block, CRM_Utils_Array::value('id', $params));
- if (empty($params['id']) && ($blockCnt == 1)) {
- $params[$blockFieldName][$blockCnt]['is_primary'] = TRUE;
+ if (empty($params['id']) && (count($params[$blockFieldName]) == 1)) {
+ $params[$blockFieldName][$values['location_type_id']]['is_primary'] = TRUE;
}
// we only process single block at a time.
$params['address'] = [];
}
- if (!array_key_exists('Address', $fields)) {
- $fields['Address'] = CRM_Core_DAO_Address::fields();
- }
-
// Note: we doing multiple value formatting here for address custom fields, plus putting into right format.
// The actual formatting (like date, country ..etc) for address custom fields is taken care of while saving
// the address in CRM_Core_BAO_Address::create method
foreach ($values as $key => $val) {
$customFieldID = CRM_Core_BAO_CustomField::getKeyID($key);
if ($customFieldID && array_key_exists($customFieldID, $customFields)) {
- // mark an entry in fields array since we want the value of custom field to be copied
- $fields['Address'][$key] = NULL;
$htmlType = CRM_Utils_Array::value('html_type', $customFields[$customFieldID]);
switch ($htmlType) {
$values = $newValues;
}
+ $fields['Address'] = $this->getMetadataForEntity('Address');
+ // @todo this is kinda replicated below....
_civicrm_api3_store_values($fields['Address'], $values, $params['address'][$values['location_type_id']]);
$addressFields = [
'supplemental_address_3',
'StateProvince.name',
];
+ foreach (array_keys($customFields) as $customFieldID) {
+ $addressFields[] = 'custom_' . $customFieldID;
+ }
foreach ($addressFields as $field) {
if (array_key_exists($field, $values)) {
}
}
+ $this->fillPrimary($params['address'][$values['location_type_id']], $values, 'address', CRM_Utils_Array::value('id', $params));
+ return TRUE;
+ }
+
+ /**
+ * Get the field metadata for the relevant entity.
+ *
+ * @param string $entity
+ *
+ * @return array
+ */
+ protected function getMetadataForEntity($entity) {
+ if (!isset($this->fieldMetadata[$entity])) {
+ $className = "CRM_Core_DAO_$entity";
+ $this->fieldMetadata[$entity] = $className::fields();
+ }
+ return $this->fieldMetadata[$entity];
+ }
+
+ /**
+ * Fill in the primary location.
+ *
+ * If the contact has a primary address we update it. Otherwise
+ * we add an address of the default location type.
+ *
+ * @param array $params
+ * Address block parameters
+ * @param array $values
+ * Input values
+ * @param string $entity
+ * - address, email, phone
+ * @param int|NULL $contactID
+ */
+ protected function fillPrimary(&$params, $values, $entity, $contactID) {
if ($values['location_type_id'] === 'Primary') {
- if (!empty($params['id'])) {
- $primary = civicrm_api3('Address', 'get', [
+ if ($contactID) {
+ $primary = civicrm_api3($entity, 'get', [
'return' => 'location_type_id',
- 'contact_id' => $params['id'],
+ 'contact_id' => $contactID,
'is_primary' => 1,
- 'sequential' => 1
+ 'sequential' => 1,
]);
}
$defaultLocationType = CRM_Core_BAO_LocationType::getDefault();
- $params['address'][$values['location_type_id']]['location_type_id'] = (isset($primary) && $primary['count']) ? $primary['values'][0]['location_type_id'] : $defaultLocationType->id;
- $params['address'][$values['location_type_id']]['is_primary'] = 1;
-
+ $params['location_type_id'] = (int) (isset($primary) && $primary['count']) ? $primary['values'][0]['location_type_id'] : $defaultLocationType->id;
+ $params['is_primary'] = 1;
}
- return TRUE;
}
}
public static function flipDupePairs($prevNextId = NULL) {
if (!$prevNextId) {
// @todo figure out if this is always POST & specify that rather than inexact GET
- $prevNextId = CRM_Utils_Request::retrieve('pnid', 'Integer');
+
+ // We cannot use CRM_Utils_Request::retrieve() because it might be an array.
+ // It later gets validated in escapeAll below.
+ $prevNextId = $_REQUEST['pnid'];
}
$onlySelected = FALSE;
/**
* Function to get the exceptions
*
- * @return array $exceptions
- * @access protected
+ * @return array $exceptionsd
*/
- protected function getExceptions() {
+ public function getExceptions() {
list($offset, $limit) = $this->_pager->getOffsetAndRowCount();
$contactOneQ = CRM_Utils_Request::retrieve('crmContact1Q', 'String');
CRM_Dedupe_Merger::resetMergeStats($cacheKeyString);
}
- $this->_mainContacts = CRM_Dedupe_Merger::getDuplicatePairs($rgid, $gid, !$isConflictMode, 0, $this->isSelected(), '', $isConflictMode, $criteria, TRUE, $limit);
+ $this->_mainContacts = CRM_Dedupe_Merger::getDuplicatePairs($rgid, $gid, !$isConflictMode, 0, $this->isSelected(), $isConflictMode, $criteria, TRUE, $limit);
if (empty($this->_mainContacts)) {
if ($isConflictMode) {
*/
class CRM_Contact_Page_ImageFile extends CRM_Core_Page {
/**
- * @var int Time to live (seconds).
+ * Time to live (seconds).
+ *
+ * @var int
*
* 12 hours: 12 * 60 * 60 = 43200
*/
class CRM_Contact_Page_View_ContactSmartGroup extends CRM_Core_Page {
/**
- * @var int contact id
+ * Contact id.
+ *
+ * @var int
*/
public $_contactId;
/**
- * called when action is browse.
- *
+ * Called when action is browse.
*/
public function browse() {
$in = CRM_Contact_BAO_GroupContact::getContactGroup($this->_contactId, 'Added');
*/
public static $_commentLinks = NULL;
+ /**
+ * Notes found running the browse function
+ * @var array
+ */
+ public $values = [];
+
/**
* View details of a note.
*/
$note = new CRM_Core_DAO_Note();
$note->id = $this->_id;
if ($note->find(TRUE)) {
- $values = [];
- CRM_Core_DAO::storeValues($note, $values);
- $values['privacy'] = CRM_Core_PseudoConstant::getLabel('CRM_Core_BAO_Note', 'privacy', $values['privacy']);
- $this->assign('note', $values);
+ CRM_Core_DAO::storeValues($note, $this->values);
+ $this->values['privacy'] = CRM_Core_PseudoConstant::getLabel('CRM_Core_BAO_Note', 'privacy', $this->values['privacy']);
+ $this->assign('note', $this->values);
}
- $comments = CRM_Core_BAO_Note::getNoteTree($values['id'], 1);
+ $comments = CRM_Core_BAO_Note::getNoteTree($this->values['id'], 1);
if (!empty($comments)) {
$this->assign('comments', $comments);
}
$this->assign('canAddNotes', CRM_Core_Permission::check('add contact notes'));
- $values = [];
$links = self::links();
$action = array_sum(array_keys($links)) & $mask;
$note->find();
while ($note->fetch()) {
if (!CRM_Core_BAO_Note::getNotePrivacyHidden($note)) {
- CRM_Core_DAO::storeValues($note, $values[$note->id]);
+ CRM_Core_DAO::storeValues($note, $this->values[$note->id]);
- $values[$note->id]['action'] = CRM_Core_Action::formLink($links,
+ $this->values[$note->id]['action'] = CRM_Core_Action::formLink($links,
$action,
[
'id' => $note->id,
$contact->id = $note->contact_id;
$contact->find();
$contact->fetch();
- $values[$note->id]['createdBy'] = $contact->display_name;
+ $this->values[$note->id]['createdBy'] = $contact->display_name;
}
- $values[$note->id]['comment_count'] = CRM_Core_BAO_Note::getChildCount($note->id);
+ $this->values[$note->id]['comment_count'] = CRM_Core_BAO_Note::getChildCount($note->id);
// paper icon view for attachments part
$paperIconAttachmentInfo = CRM_Core_BAO_File::paperIconAttachment('civicrm_note', $note->id);
- $values[$note->id]['attachment'] = $paperIconAttachmentInfo;
+ $this->values[$note->id]['attachment'] = $paperIconAttachmentInfo;
}
}
-
- $this->assign('notes', $values);
+ $this->assign('notes', $this->values);
$commentLinks = self::commentLinks();
/**
* Field for all the objects related to this contribution
+ *
* @var array of objects (e.g membership object, participant object)
*/
- public $_relatedObjects = array();
+ public $_relatedObjects = [];
/**
* Field for the component - either 'event' (participant) or 'contribute'
*
* @return \CRM_Contribute_BAO_Contribution
* @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
*/
- public static function add(&$params, $ids = array()) {
+ public static function add(&$params, $ids = []) {
if (empty($params)) {
return NULL;
}
//per http://wiki.civicrm.org/confluence/display/CRM/Database+layer we are moving away from $ids array
$contributionID = CRM_Utils_Array::value('contribution', $ids, CRM_Utils_Array::value('id', $params));
- $duplicates = array();
+ $duplicates = [];
if (self::checkDuplicate($params, $duplicates, $contributionID)) {
$message = ts("Duplicate error - existing contribution record(s) have a matching Transaction ID or Invoice ID. Contribution record ID(s) are: " . implode(', ', $duplicates));
throw new CRM_Core_Exception($message);
}
// first clean up all the money fields
- $moneyFields = array(
+ $moneyFields = [
'total_amount',
'net_amount',
'fee_amount',
'non_deductible_amount',
- );
+ ];
//if priceset is used, no need to cleanup money
if (!empty($params['skipCleanMoney'])) {
else {
// Since the fee amount is expecting this (later on) ensure it is always set.
// It would only not be set for an update where it is unchanged.
- $params['contribution_status_id'] = civicrm_api3('Contribution', 'getvalue', array('id' => $contributionID, 'return' => 'contribution_status_id'));
+ $params['contribution_status_id'] = civicrm_api3('Contribution', 'getvalue', [
+ 'id' => $contributionID,
+ 'return' => 'contribution_status_id',
+ ]);
}
if (!$contributionID
&& CRM_Utils_Array::value('membership_id', $params)
- && self::checkContributeSettings('deferred_revenue_enabled')
+ && Civi::settings()->get('deferred_revenue_enabled')
) {
$memberStartDate = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $params['membership_id'], 'start_date');
if ($memberStartDate) {
/**
* Get defaults for new entity.
+ *
* @return array
*/
public static function getDefaults() {
- return array(
+ return [
'payment_instrument_id' => key(CRM_Core_OptionGroup::values('payment_instrument',
- FALSE, FALSE, FALSE, 'AND is_default = 1')
+ FALSE, FALSE, FALSE, 'AND is_default = 1')
),
- 'contribution_status_id' => CRM_Core_Pseudoconstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'),
- );
+ 'contribution_status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'),
+ ];
}
/**
* @throws CRM_Core_Exception
*/
public static function getValuesWithMappings($params) {
- $values = $ids = array();
+ $values = $ids = [];
$contribution = self::getValues($params, $values, $ids);
if (is_null($contribution)) {
throw new CRM_Core_Exception('No contribution found');
if (isset($params['fee_amount']) || isset($params['total_amount'])) {
// We have an existing contribution and fee_amount or total_amount has been passed in but not net_amount.
// net_amount may need adjusting.
- $contribution = civicrm_api3('Contribution', 'getsingle', array(
+ $contribution = civicrm_api3('Contribution', 'getsingle', [
'id' => $contributionID,
- 'return' => array('total_amount', 'net_amount', 'fee_amount'),
- ));
+ 'return' => ['total_amount', 'net_amount', 'fee_amount'],
+ ]);
$totalAmount = isset($params['total_amount']) ? $params['total_amount'] : CRM_Utils_Array::value('total_amount', $contribution);
$feeAmount = isset($params['fee_amount']) ? $params['fee_amount'] : CRM_Utils_Array::value('fee_amount', $contribution);
$params['net_amount'] = $totalAmount - $feeAmount;
*/
protected static function getBillingAddressParams($params, $billingLocationTypeID) {
$hasBillingField = FALSE;
- $billingFields = array(
+ $billingFields = [
'street_address',
'city',
'state_province_id',
'postal_code',
'country_id',
- );
+ ];
//build address array
- $addressParams = array();
+ $addressParams = [];
$addressParams['location_type_id'] = $billingLocationTypeID;
$addressParams['is_billing'] = 1;
$hasBillingField = TRUE;
}
}
- return array($hasBillingField, $addressParams);
+ return [$hasBillingField, $addressParams];
}
/**
$addressParams[substr($name, 9)] = $addressParams[$field];
}
}
- return array($hasBillingField, $addressParams);
+ return [$hasBillingField, $addressParams];
}
/**
SELECT membership_num_terms FROM civicrm_line_item li
LEFT JOIN civicrm_price_field_value v ON li.price_field_value_id = v.id
WHERE contribution_id = %1 AND membership_type_id = %2",
- array(1 => array($contributionID, 'Integer'), 2 => array($membershipTypeID, 'Integer'))
+ [1 => [$contributionID, 'Integer'], 2 => [$membershipTypeID, 'Integer']]
);
// default of 1 is precautionary
return empty($numTerms) ? 1 : $numTerms;
*
* @return CRM_Contribute_BAO_Contribution
*/
- public static function create(&$params, $ids = array()) {
- $dateFields = array('receive_date', 'cancel_date', 'receipt_date', 'thankyou_date', 'revenue_recognition_date');
+ public static function create(&$params, $ids = []) {
+ $dateFields = [
+ 'receive_date',
+ 'cancel_date',
+ 'receipt_date',
+ 'thankyou_date',
+ 'revenue_recognition_date',
+ ];
foreach ($dateFields as $df) {
if (isset($params[$df])) {
$params[$df] = CRM_Utils_Date::isoToMysql($params[$df]);
$session = CRM_Core_Session::singleton();
if (!empty($params['note'])) {
- $noteParams = array(
+ $noteParams = [
'entity_table' => 'civicrm_contribution',
'note' => $params['note'],
'entity_id' => $contribution->id,
'contact_id' => $session->get('userID'),
'modified_date' => date('Ymd'),
- );
+ ];
if (!$noteParams['contact_id']) {
$noteParams['contact_id'] = $params['contact_id'];
}
// make entry in batch entity batch table
if (!empty($params['batch_id'])) {
// in some update cases we need to get extra fields - ie an update that doesn't pass in all these params
- $titleFields = array(
+ $titleFields = [
'contact_id',
'total_amount',
'currency',
'financial_type_id',
- );
+ ];
$retrieveRequired = 0;
foreach ($titleFields as $titleField) {
if (!isset($contribution->$titleField)) {
$transaction->commit();
- $activity = civicrm_api3('Activity', 'get', array(
+ $activity = civicrm_api3('Activity', 'get', [
'source_record_id' => $contribution->id,
- 'options' => array('limit' => 1),
+ 'options' => ['limit' => 1],
'sequential' => 1,
'activity_type_id' => 'Contribution',
- 'return' => array('id', 'campaign'),
- ));
+ 'return' => ['id', 'campaign'],
+ ]);
//CRM-18406: Update activity when edit contribution.
if ($activity['count']) {
"action=view&reset=1&id={$contribution->id}&cid={$contribution->contact_id}&context=home"
);
// in some update cases we need to get extra fields - ie an update that doesn't pass in all these params
- $titleFields = array(
+ $titleFields = [
'contact_id',
'total_amount',
'currency',
'financial_type_id',
- );
+ ];
$retrieveRequired = 0;
foreach ($titleFields as $titleField) {
if (!isset($contribution->$titleField)) {
$financialType = CRM_Contribute_PseudoConstant::financialType($contribution->financial_type_id);
$title = CRM_Contact_BAO_Contact::displayName($contribution->contact_id) . ' - (' . CRM_Utils_Money::format($contribution->total_amount, $contribution->currency) . ' ' . ' - ' . $financialType . ')';
- $recentOther = array();
+ $recentOther = [];
if (CRM_Core_Permission::checkActionPermission('CiviContribute', CRM_Core_Action::UPDATE)) {
$recentOther['editUrl'] = CRM_Utils_System::url('civicrm/contact/view/contribution',
"action=update&reset=1&id={$contribution->id}&cid={$contribution->contact_id}&context=home"
public static function &importableFields($contactType = 'Individual', $status = TRUE) {
if (!self::$_importableFields) {
if (!self::$_importableFields) {
- self::$_importableFields = array();
+ self::$_importableFields = [];
}
if (!$status) {
- $fields = array('' => array('title' => ts('- do not import -')));
+ $fields = ['' => ['title' => ts('- do not import -')]];
}
else {
- $fields = array('' => array('title' => ts('- Contribution Fields -')));
+ $fields = ['' => ['title' => ts('- Contribution Fields -')]];
}
$note = CRM_Core_DAO_Note::import();
$contactFields = CRM_Contact_BAO_Contact::importableFields($contactType, NULL);
// Using new Dedupe rule.
- $ruleParams = array(
+ $ruleParams = [
'contact_type' => $contactType,
'used' => 'Unsupervised',
- );
+ ];
$fieldsArray = CRM_Dedupe_BAO_Rule::dedupeRuleFields($ruleParams);
- $tmpContactField = array();
+ $tmpContactField = [];
if (is_array($fieldsArray)) {
foreach ($fieldsArray as $value) {
//skip if there is no dupe rule
public static function &exportableFields($checkPermission = TRUE) {
if (!self::$_exportableFields) {
if (!self::$_exportableFields) {
- self::$_exportableFields = array();
+ self::$_exportableFields = [];
}
$fields = CRM_Contribute_DAO_Contribution::export();
$financialAccount = CRM_Financial_DAO_FinancialAccount::export();
- $contributionPage = array(
- 'contribution_page' => array(
+ $contributionPage = [
+ 'contribution_page' => [
'title' => ts('Contribution Page'),
'name' => 'contribution_page',
'where' => 'civicrm_contribution_page.title',
'data_type' => CRM_Utils_Type::T_STRING,
- ),
- );
+ ],
+ ];
- $contributionNote = array(
- 'contribution_note' => array(
+ $contributionNote = [
+ 'contribution_note' => [
'title' => ts('Contribution Note'),
'name' => 'contribution_note',
'data_type' => CRM_Utils_Type::T_TEXT,
- ),
- );
+ ],
+ ];
- $extraFields = array(
- 'contribution_batch' => array(
+ $extraFields = [
+ 'contribution_batch' => [
'title' => ts('Batch Name'),
- ),
- );
+ ],
+ ];
// CRM-17787
- $campaignTitle = array(
- 'contribution_campaign_title' => array(
+ $campaignTitle = [
+ 'contribution_campaign_title' => [
'title' => ts('Campaign Title'),
'name' => 'campaign_title',
'where' => 'civicrm_campaign.title',
'data_type' => CRM_Utils_Type::T_STRING,
- ),
- );
- $softCreditFields = array(
- 'contribution_soft_credit_name' => array(
+ ],
+ ];
+ $softCreditFields = [
+ 'contribution_soft_credit_name' => [
'name' => 'contribution_soft_credit_name',
'title' => ts('Soft Credit For'),
'where' => 'civicrm_contact_d.display_name',
'data_type' => CRM_Utils_Type::T_STRING,
- ),
- 'contribution_soft_credit_amount' => array(
+ ],
+ 'contribution_soft_credit_amount' => [
'name' => 'contribution_soft_credit_amount',
'title' => ts('Soft Credit Amount'),
'where' => 'civicrm_contribution_soft.amount',
'data_type' => CRM_Utils_Type::T_MONEY,
- ),
- 'contribution_soft_credit_type' => array(
+ ],
+ 'contribution_soft_credit_type' => [
'name' => 'contribution_soft_credit_type',
'title' => ts('Soft Credit Type'),
'where' => 'contribution_softcredit_type.label',
'data_type' => CRM_Utils_Type::T_STRING,
- ),
- 'contribution_soft_credit_contribution_id' => array(
+ ],
+ 'contribution_soft_credit_contribution_id' => [
'name' => 'contribution_soft_credit_contribution_id',
'title' => ts('Soft Credit For Contribution ID'),
'where' => 'civicrm_contribution_soft.contribution_id',
'data_type' => CRM_Utils_Type::T_INT,
- ),
- 'contribution_soft_credit_contact_id' => array(
+ ],
+ 'contribution_soft_credit_contact_id' => [
'name' => 'contribution_soft_credit_contact_id',
'title' => ts('Soft Credit For Contact ID'),
'where' => 'civicrm_contact_d.id',
'data_type' => CRM_Utils_Type::T_INT,
- ),
- );
+ ],
+ ];
$fields = array_merge($fields, $contributionPage,
$contributionNote, $extraFields, $softCreditFields, $financialAccount, $campaignTitle,
}
/**
- * @param $contributionId
- * @param $participantId
- * @param array $financialTrxn
+ * Record an activity when a payment is received.
+ *
+ * @todo this is intended to be moved to payment BAO class as a protected function
+ * on that class. Currently being cleaned up. The addActivityForPayment doesn't really
+ * merit it's own function as it makes the code less rather than more readable.
+ *
+ * @param int $contributionId
+ * @param int $participantId
+ * @param string $totalAmount
+ * @param string $currency
+ * @param string $trxnDate
*
- * @param $financialTrxn
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
*/
- protected static function recordPaymentActivity($contributionId, $participantId, $financialTrxn) {
- $activityType = ($financialTrxn->total_amount < 0) ? 'Refund' : 'Payment';
+ protected static function recordPaymentActivity($contributionId, $participantId, $totalAmount, $currency, $trxnDate) {
+ $activityType = ($totalAmount < 0) ? 'Refund' : 'Payment';
+
if ($participantId) {
$inputParams['id'] = $participantId;
$values = [];
$ids = [];
- $component = 'event';
$entityObj = CRM_Event_BAO_Participant::getValues($inputParams, $values, $ids);
$entityObj = $entityObj[$participantId];
+ $title = CRM_Core_DAO::getFieldValue('CRM_Event_BAO_Event', $entityObj->event_id, 'title');
}
else {
$entityObj = new CRM_Contribute_BAO_Contribution();
$entityObj->id = $contributionId;
$entityObj->find(TRUE);
- $component = 'contribution';
+ $title = ts('Contribution');
}
-
- self::addActivityForPayment($entityObj, $financialTrxn, $activityType, $component, $contributionId);
+ // @todo per block above this is not a logical splitting off of functionality.
+ self::addActivityForPayment($entityObj->contact_id, $activityType, $title, $contributionId, $totalAmount, $currency, $trxnDate);
}
/**
])['values'];
}
+ /**
+ * Cancel contribution.
+ *
+ * This function should only be called from transitioncomponents - it is an interim step in refactoring.
+ *
+ * @param $processContributionObject
+ * @param $memberships
+ * @param $contributionId
+ * @param $membershipStatuses
+ * @param $updateResult
+ * @param $participant
+ * @param $oldStatus
+ * @param $pledgePayment
+ * @param $pledgeID
+ * @param $pledgePaymentIDs
+ * @param $contributionStatusId
+ *
+ * @return array
+ */
+ protected static function cancel($processContributionObject, $memberships, $contributionId, $membershipStatuses, $updateResult, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId) {
+ $processContribution = FALSE;
+ $participantStatuses = CRM_Event_PseudoConstant::participantStatus();
+ if (is_array($memberships)) {
+ foreach ($memberships as $membership) {
+ $update = TRUE;
+ //Update Membership status if there is no other completed contribution associated with the membership.
+ $relatedContributions = CRM_Member_BAO_Membership::getMembershipContributionId($membership->id, TRUE);
+ foreach ($relatedContributions as $contriId) {
+ if ($contriId == $contributionId) {
+ continue;
+ }
+ $statusId = CRM_Core_DAO::getFieldValue('CRM_Contribute_BAO_Contribution', $contriId, 'contribution_status_id');
+ if (CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $statusId) === 'Completed') {
+ $update = FALSE;
+ }
+ }
+ if ($membership && $update) {
+ $newStatus = array_search('Cancelled', $membershipStatuses);
+
+ // Create activity
+ $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
+ $activityParam = [
+ 'subject' => "Status changed from {$allStatus[$membership->status_id]} to {$allStatus[$newStatus]}",
+ 'source_contact_id' => CRM_Core_Session::singleton()->get('userID'),
+ 'target_contact_id' => $membership->contact_id,
+ 'source_record_id' => $membership->id,
+ 'activity_type_id' => 'Change Membership Status',
+ 'status_id' => 'Completed',
+ 'priority_id' => 'Normal',
+ 'activity_date_time' => 'now',
+ ];
+
+ $membership->status_id = $newStatus;
+ $membership->is_override = TRUE;
+ $membership->status_override_end_date = 'null';
+ $membership->save();
+ civicrm_api3('activity', 'create', $activityParam);
+
+ $updateResult['updatedComponents']['CiviMember'] = $membership->status_id;
+ if ($processContributionObject) {
+ $processContribution = TRUE;
+ }
+ }
+ }
+ }
+
+ if ($participant) {
+ $updatedStatusId = array_search('Cancelled', $participantStatuses);
+ CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE);
+
+ $updateResult['updatedComponents']['CiviEvent'] = $updatedStatusId;
+ if ($processContributionObject) {
+ $processContribution = TRUE;
+ }
+ }
+
+ if ($pledgePayment) {
+ CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeID, $pledgePaymentIDs, $contributionStatusId);
+
+ $updateResult['updatedComponents']['CiviPledge'] = $contributionStatusId;
+ if ($processContributionObject) {
+ $processContribution = TRUE;
+ }
+ }
+ return [$updateResult, $processContribution];
+ }
+
/**
* @inheritDoc
*/
* @return array|null
*/
public static function getTotalAmountAndCount($status = NULL, $startDate = NULL, $endDate = NULL) {
- $where = array();
+ $where = [];
switch ($status) {
case 'Valid':
$where[] = 'contribution_status_id = 1';
";
$dao = CRM_Core_DAO::executeQuery($query);
- $amount = array();
+ $amount = [];
$count = 0;
while ($dao->fetch()) {
$count += $dao->total_count;
$amount[] = CRM_Utils_Money::format($dao->total_amount, $dao->currency);
}
if ($count) {
- return array(
+ return [
'amount' => implode(', ', $amount),
'count' => $count,
- );
+ ];
}
return NULL;
}
$results = NULL;
//delete activity record
- $params = array(
+ $params = [
'source_record_id' => $id,
// activity type id for contribution
'activity_type_id' => 6,
- );
+ ];
CRM_Activity_BAO_Activity::deleteActivity($params);
CRM_Utils_Hook::post('delete', 'Contribution', $dao->id, $dao);
// delete the recently created Contribution
- $contributionRecent = array(
+ $contributionRecent = [
'id' => $id,
'type' => 'Contribution',
- );
+ ];
CRM_Utils_Recent::del($contributionRecent);
return $results;
* @throws \CiviCRM_API3_Exception
*/
public static function failPayment($contributionID, $contactID, $message) {
- civicrm_api3('activity', 'create', array(
+ civicrm_api3('activity', 'create', [
'activity_type_id' => 'Failed Payment',
'details' => $message,
'subject' => ts('Payment failed at payment processor'),
'source_record_id' => $contributionID,
- 'source_contact_id' => CRM_Core_Session::getLoggedInContactID() ? CRM_Core_Session::getLoggedInContactID() :
- $contactID,
- ));
+ 'source_contact_id' => CRM_Core_Session::getLoggedInContactID() ? CRM_Core_Session::getLoggedInContactID() : $contactID,
+ ]);
// CRM-20336 Make sure that the contribution status is Failed, not Pending.
- civicrm_api3('contribution', 'create', array(
+ civicrm_api3('contribution', 'create', [
'id' => $contributionID,
'contribution_status_id' => 'Failed',
- ));
+ ]);
}
/**
$trxn_id = CRM_Utils_Array::value('trxn_id', $input);
$invoice_id = CRM_Utils_Array::value('invoice_id', $input);
- $clause = array();
- $input = array();
+ $clause = [];
+ $input = [];
if ($trxn_id) {
$clause[] = "trxn_id = %1";
- $input[1] = array($trxn_id, 'String');
+ $input[1] = [$trxn_id, 'String'];
}
if ($invoice_id) {
$clause[] = "invoice_id = %2";
- $input[2] = array($invoice_id, 'String');
+ $input[2] = [$invoice_id, 'String'];
}
if (empty($clause)) {
$clause = implode(' OR ', $clause);
if ($id) {
$clause = "( $clause ) AND id != %3";
- $input[3] = array($id, 'Integer');
+ $input[3] = [$id, 'Integer'];
}
$query = "SELECT id FROM civicrm_contribution WHERE $clause";
* Add extra fields specific to contribution.
*/
public static function getSpecialContributionFields() {
- $extraFields = array(
- 'contribution_soft_credit_name' => array(
+ $extraFields = [
+ 'contribution_soft_credit_name' => [
'name' => 'contribution_soft_credit_name',
'title' => ts('Soft Credit Name'),
'headerPattern' => '/^soft_credit_name$/i',
'where' => 'civicrm_contact_d.display_name',
- ),
- 'contribution_soft_credit_email' => array(
+ ],
+ 'contribution_soft_credit_email' => [
'name' => 'contribution_soft_credit_email',
'title' => ts('Soft Credit Email'),
'headerPattern' => '/^soft_credit_email$/i',
'where' => 'soft_email.email',
- ),
- 'contribution_soft_credit_phone' => array(
+ ],
+ 'contribution_soft_credit_phone' => [
'name' => 'contribution_soft_credit_phone',
'title' => ts('Soft Credit Phone'),
'headerPattern' => '/^soft_credit_phone$/i',
'where' => 'soft_phone.phone',
- ),
- 'contribution_soft_credit_contact_id' => array(
+ ],
+ 'contribution_soft_credit_contact_id' => [
'name' => 'contribution_soft_credit_contact_id',
'title' => ts('Soft Credit Contact ID'),
'headerPattern' => '/^soft_credit_contact_id$/i',
'where' => 'civicrm_contribution_soft.contact_id',
- ),
- 'contribution_pcp_title' => array(
+ ],
+ 'contribution_pcp_title' => [
'name' => 'contribution_pcp_title',
'title' => ts('Personal Campaign Page Title'),
'headerPattern' => '/^contribution_pcp_title$/i',
'where' => 'contribution_pcp.title',
- ),
- );
+ ],
+ ];
return $extraFields;
}
";
$config = CRM_Core_Config::singleton();
- $params = array(1 => array($pageID, 'Integer'));
+ $params = [1 => [$pageID, 'Integer']];
$dao = CRM_Core_DAO::executeQuery($query, $params);
if ($dao->fetch()) {
- return array($dao->goal, $dao->total);
+ return [$dao->goal, $dao->total];
}
else {
- return array(NULL, NULL);
+ return [NULL, NULL];
}
}
*
* The returned array provides details about the original contribution & donor.
*
- * @todo - this is a confusing function called from one place. It has a test. It would be
- * nice to deprecate it.
- *
* @param int $honorId
* In Honor of Contact ID.
*
* @return array
* list of contribution fields
+ * @todo - this is a confusing function called from one place. It has a test. It would be
+ * nice to deprecate it.
+ *
*/
public static function getHonorContacts($honorId) {
- $params = array();
+ $params = [];
$honorDAO = new CRM_Contribute_DAO_ContributionSoft();
$honorDAO->contact_id = $honorId;
$honorDAO->find();
$query = self::getAnnualQuery($contactIDs);
$dao = CRM_Core_DAO::executeQuery($query);
$count = 0;
- $amount = $average = array();
+ $amount = $average = [];
while ($dao->fetch()) {
if ($dao->count > 0 && $dao->amount > 0) {
$count += $dao->count;
}
}
if ($count > 0) {
- return array(
+ return [
$count,
implode(', ', $amount),
implode(', ', $average),
- );
+ ];
}
- return array(0, 0, 0);
+ return [0, 0, 0];
}
/**
public static function checkDuplicateIds($params) {
$dao = new CRM_Contribute_DAO_Contribution();
- $clause = array();
- $input = array();
+ $clause = [];
+ $input = [];
foreach ($params as $k => $v) {
if ($v) {
$clause[] = "$k = '$v'";
* associated array
*/
public static function getContributionDetails($exportMode, $componentIds) {
- $paymentDetails = array();
+ $paymentDetails = [];
$componentClause = ' IN ( ' . implode(',', $componentIds) . ' ) ';
if ($exportMode == CRM_Export_Form_Select::EVENT_EXPORT) {
$dao = CRM_Core_DAO::executeQuery($query);
while ($dao->fetch()) {
- $paymentDetails[$dao->id] = array(
+ $paymentDetails[$dao->id] = [
'total_amount' => $dao->total_amount,
'contribution_status' => $dao->status,
'receive_date' => $dao->receive_date,
'pay_instru' => $dao->payment_instrument,
'trxn_id' => $dao->trxn_id,
- );
+ ];
}
return $paymentDetails;
* @param int $contactId
*/
public static function deleteAddress($contributionId = NULL, $contactId = NULL) {
- $clauses = array();
+ $clauses = [];
$contactJoin = NULL;
if ($contributionId) {
$dao = CRM_Core_DAO::executeQuery($query);
while ($dao->fetch()) {
- $params = array('id' => $dao->id);
+ $params = ['id' => $dao->id];
CRM_Core_BAO_Block::blockDelete('Address', $params);
}
}
public static function checkOnlinePendingContribution($componentId, $componentName) {
$contributionId = NULL;
if (!$componentId ||
- !in_array($componentName, array('Event', 'Membership'))
+ !in_array($componentName, ['Event', 'Membership'])
) {
return $contributionId;
}
*
* This function by-passes hooks - to address this - don't use this function.
*
- * @deprecated
- *
- * Use api contribute.completetransaction
- * For failures use failPayment (preferably exposing by api in the process).
- *
* @param array $params
* @param bool $processContributionObject
*
* @return array
* @throws \Exception
+ * @deprecated
+ *
+ * Use api contribute.completetransaction
+ * For failures use failPayment (preferably exposing by api in the process).
+ *
*/
public static function transitionComponents($params, $processContributionObject = FALSE) {
// get minimum required values.
// if we already processed contribution object pass previous status id.
$previousContriStatusId = CRM_Utils_Array::value('previous_contribution_status_id', $params);
- $updateResult = array();
+ $updateResult = [];
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
// we process only ( Completed, Cancelled, or Failed ) contributions.
if (!$contributionId ||
- !in_array($contributionStatusId, array(
+ !in_array($contributionStatusId, [
array_search('Completed', $contributionStatuses),
array_search('Cancelled', $contributionStatuses),
array_search('Failed', $contributionStatuses),
- ))
+ ])
) {
return $updateResult;
}
$baseIPN = new CRM_Core_Payment_BaseIPN();
- $input = $ids = $objects = array();
+ $input = $ids = $objects = [];
$input['component'] = CRM_Utils_Array::value('component', $componentDetails);
$ids['contribution'] = $contributionId;
$participant = &$objects['participant'];
$pledgePayment = &$objects['pledge_payment'];
$contribution = &$objects['contribution'];
-
+ $pledgeID = $oldStatus = NULL;
+ $pledgePaymentIDs = [];
if ($pledgePayment) {
- $pledgePaymentIDs = array();
foreach ($pledgePayment as $key => $object) {
$pledgePaymentIDs[] = $object->id;
}
// we might want to process contribution object.
$processContribution = FALSE;
if ($contributionStatusId == array_search('Cancelled', $contributionStatuses)) {
- if (is_array($memberships)) {
- foreach ($memberships as $membership) {
- $update = TRUE;
- //Update Membership status if there is no other completed contribution associated with the membership.
- $relatedContributions = CRM_Member_BAO_Membership::getMembershipContributionId($membership->id, TRUE);
- foreach ($relatedContributions as $contriId) {
- if ($contriId == $contributionId) {
- continue;
- }
- $statusId = CRM_Core_DAO::getFieldValue('CRM_Contribute_BAO_Contribution', $contriId, 'contribution_status_id');
- if (CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $statusId) === 'Completed') {
- $update = FALSE;
- }
- }
- if ($membership && $update) {
- $newStatus = array_search('Cancelled', $membershipStatuses);
-
- // Create activity
- $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
- $activityParam = array(
- 'subject' => "Status changed from {$allStatus[$membership->status_id]} to {$allStatus[$newStatus]}",
- 'source_contact_id' => CRM_Core_Session::singleton()->get('userID'),
- 'target_contact_id' => $membership->contact_id,
- 'source_record_id' => $membership->id,
- 'activity_type_id' => 'Change Membership Status',
- 'status_id' => 'Completed',
- 'priority_id' => 'Normal',
- 'activity_date_time' => 'now',
- );
-
- $membership->status_id = $newStatus;
- $membership->is_override = TRUE;
- $membership->status_override_end_date = 'null';
- $membership->save();
- civicrm_api3('activity', 'create', $activityParam);
-
- $updateResult['updatedComponents']['CiviMember'] = $membership->status_id;
- if ($processContributionObject) {
- $processContribution = TRUE;
- }
- }
- }
- }
-
- if ($participant) {
- $updatedStatusId = array_search('Cancelled', $participantStatuses);
- CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE);
-
- $updateResult['updatedComponents']['CiviEvent'] = $updatedStatusId;
- if ($processContributionObject) {
- $processContribution = TRUE;
- }
- }
-
- if ($pledgePayment) {
- CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeID, $pledgePaymentIDs, $contributionStatusId);
-
- $updateResult['updatedComponents']['CiviPledge'] = $contributionStatusId;
- if ($processContributionObject) {
- $processContribution = TRUE;
- }
- }
+ // Call interim cancel function - with a goal to cleaning up the signature on it and switching to a tested api Contribution.cancel function.
+ list($updateResult, $processContribution) = self::cancel($processContributionObject, $memberships, $contributionId, $membershipStatuses, $updateResult, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId);
}
elseif ($contributionStatusId == array_search('Failed', $contributionStatuses)) {
if (is_array($memberships)) {
// only pending contribution related object processed.
if ($previousContriStatusId &&
- !in_array($contributionStatuses[$previousContriStatusId], array('Pending', 'Partially paid'))
+ !in_array($contributionStatuses[$previousContriStatusId], [
+ 'Pending',
+ 'Partially paid',
+ ])
) {
// this is case when we already processed contribution object.
return $updateResult;
}
elseif (!$previousContriStatusId &&
- !in_array($contributionStatuses[$contribution->contribution_status_id], array('Pending', 'Partially paid'))
+ !in_array($contributionStatuses[$contribution->contribution_status_id], [
+ 'Pending',
+ 'Partially paid',
+ ])
) {
// this is case when we are going to process contribution object later.
return $updateResult;
(array) $membership
);
- $formattedParams = array(
+ $formattedParams = [
'status_id' => CRM_Utils_Array::value('id', $calcStatus,
array_search('Current', $membershipStatuses)
),
'join_date' => CRM_Utils_Date::customFormat($dates['join_date'], $format),
'start_date' => CRM_Utils_Date::customFormat($dates['start_date'], $format),
'end_date' => CRM_Utils_Date::customFormat($dates['end_date'], $format),
- );
+ ];
CRM_Utils_Hook::pre('edit', 'Membership', $membership->id, $formattedParams);
$membership->save();
//updating the membership log
- $membershipLog = array();
+ $membershipLog = [];
$membershipLog = $formattedParams;
$logStartDate = CRM_Utils_Date::customFormat(CRM_Utils_Array::value('log_start_date', $dates), $format);
$logStartDate = ($logStartDate) ? CRM_Utils_Date::isoToMysql($logStartDate) : $formattedParams['start_date'];
//update related Memberships.
CRM_Member_BAO_Membership::updateRelatedMemberships($membership->id, $formattedParams);
- foreach (array('Membership Signup', 'Membership Renewal') as $activityType) {
+ foreach (['Membership Signup', 'Membership Renewal'] as $activityType) {
$scheduledActivityID = CRM_Utils_Array::value('id',
civicrm_api3('Activity', 'Get',
- array(
+ [
'source_record_id' => $membership->id,
'activity_type_id' => $activityType,
'status_id' => 'Scheduled',
- 'options' => array(
+ 'options' => [
'limit' => 1,
'sort' => 'id DESC',
- ),
- )
+ ],
+ ]
)
);
// 1. Update Schedule Membership Signup/Renewal activity to completed on successful payment of pending membership
// 2. OR Create renewal activity scheduled if its membership renewal will be paid later
if ($scheduledActivityID) {
- CRM_Activity_BAO_Activity::addActivity($membership, $activityType, $membership->contact_id, array('id' => $scheduledActivityID));
+ CRM_Activity_BAO_Activity::addActivity($membership, $activityType, $membership->contact_id, ['id' => $scheduledActivityID]);
break;
}
}
CRM_Activity_BAO_Activity::addActivity($membership,
'Change Membership Status',
NULL,
- array(
+ [
'subject' => "Status changed from {$allStatus[$oldStatus]} to {$allStatus[$membership->status_id]}",
'source_contact_id' => $membershipLog['modified_id'],
'priority_id' => 'Normal',
- )
+ ]
);
}
// process contribution object.
if ($processContribution) {
- $contributionParams = array();
- $fields = array(
+ $contributionParams = [];
+ $fields = [
'contact_id',
'total_amount',
'receive_date',
'non_deductible_amount',
'receipt_date',
'check_number',
- );
+ ];
foreach ($fields as $field) {
if (empty($params[$field])) {
continue;
$contributionParams[$field] = $params[$field];
}
- $ids = array('contribution' => $contributionId);
+ $ids = ['contribution' => $contributionId];
$contribution = CRM_Contribute_BAO_Contribution::create($contributionParams, $ids);
}
* @return array
*/
public static function getComponentDetails($contributionId) {
- $componentDetails = $pledgePayment = array();
+ $componentDetails = $pledgePayment = [];
if (!$contributionId) {
return $componentDetails;
}
WHERE c.id = $contributionId";
$dao = CRM_Core_DAO::executeQuery($query);
- $componentDetails = array();
+ $componentDetails = [];
while ($dao->fetch()) {
$componentDetails['component'] = $dao->participant_id ? 'event' : 'contribute';
}
if ($dao->membership_id) {
if (!isset($componentDetails['membership'])) {
- $componentDetails['membership'] = $componentDetails['membership_type'] = array();
+ $componentDetails['membership'] = $componentDetails['membership_type'] = [];
}
$componentDetails['membership'][] = $dao->membership_id;
$componentDetails['membership_type'][] = $dao->membership_type_id;
}
if (!empty($contributionParams['contribution_recur_id'])) {
- $recurringContribution = civicrm_api3('ContributionRecur', 'getsingle', array(
+ $recurringContribution = civicrm_api3('ContributionRecur', 'getsingle', [
'id' => $contributionParams['contribution_recur_id'],
- ));
+ ]);
if (!empty($recurringContribution['campaign_id'])) {
// CRM-17718 the campaign id on the contribution recur record should get precedence.
$contributionParams['campaign_id'] = $recurringContribution['campaign_id'];
}
$templateContribution = CRM_Contribute_BAO_ContributionRecur::getTemplateContribution(
$contributionParams['contribution_recur_id'],
- array_intersect_key($contributionParams, array('total_amount' => TRUE, 'financial_type_id' => TRUE))
+ array_intersect_key($contributionParams, [
+ 'total_amount' => TRUE,
+ 'financial_type_id' => TRUE,
+ ])
);
$input['line_item'] = $contributionParams['line_item'] = $templateContribution['line_item'];
*/
public static function getOnbehalfIds($contributionId, $contributorId = NULL) {
- $ids = array();
+ $ids = [];
if (!$contributionId) {
return $ids;
$activityContacts = CRM_Activity_BAO_ActivityContact::buildOptions('record_type_id', 'validate');
$sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
- $params = array(
- 1 => array($activityTypeId, 'Integer'),
- 2 => array($contributionId, 'Integer'),
- 3 => array($sourceID, 'Integer'),
- );
+ $params = [
+ 1 => [$activityTypeId, 'Integer'],
+ 2 => [$contributionId, 'Integer'],
+ 3 => [$sourceID, 'Integer'],
+ ];
$sourceContactId = CRM_Core_DAO::singleValueQuery($activityQuery, $params);
else {
$year = date('Y');
}
- $year = array('Y' => $year);
+ $year = ['Y' => $year];
$yearDate = $config->fiscalYearStart;
$yearDate = array_merge($year, $yearDate);
$yearDate = CRM_Utils_Date::format($yearDate);
$now = date('Ymd');
- return array(
+ return [
'now' => $now,
'yearDate' => $yearDate,
'monthDate' => $monthDate,
- );
+ ];
}
/**
* Load objects relations to contribution object.
* Objects are stored in the $_relatedObjects property
* In the first instance we are just moving functionality from BASEIpn -
+ *
* @see http://issues.civicrm.org/jira/browse/CRM-9996
*
* Note that the unit test for the BaseIPN class tests this function
}
// todo remove strtolower - check consistency
if (strtolower($this->_component) == 'event') {
- $eventParams = array('id' => $this->_relatedObjects['participant']->event_id);
- $values['event'] = array();
+ $eventParams = ['id' => $this->_relatedObjects['participant']->event_id];
+ $values['event'] = [];
CRM_Event_BAO_Event::retrieve($eventParams, $values['event']);
//get location details
- $locationParams = array('entity_id' => $this->_relatedObjects['participant']->event_id, 'entity_table' => 'civicrm_event');
+ $locationParams = [
+ 'entity_id' => $this->_relatedObjects['participant']->event_id,
+ 'entity_table' => 'civicrm_event',
+ ];
$values['location'] = CRM_Core_BAO_Location::getValues($locationParams);
- $ufJoinParams = array(
+ $ufJoinParams = [
'entity_table' => 'civicrm_event',
'entity_id' => $ids['event'],
'module' => 'CiviEvent',
- );
+ ];
list($custom_pre_id,
$custom_post_ids
if (isset($ids['onbehalf_dupe_alert'])) {
$values['onbehalf_dupe_alert'] = $ids['onbehalf_dupe_alert'];
}
- $entityBlock = array(
+ $entityBlock = [
'contact_id' => $ids['contact'],
'location_type_id' => CRM_Core_DAO::getFieldValue('CRM_Core_DAO_LocationType',
'Home', 'id', 'name'
),
- );
+ ];
$address = CRM_Core_BAO_Address::getValues($entityBlock);
$template->assign('onBehalfAddress', $address[$entityBlock['location_type_id']]['display']);
}
*
* @return array
*/
- public function _gatherMessageValues($input, &$values, $ids = array()) {
+ public function _gatherMessageValues($input, &$values, $ids = []) {
// set display address of contributor
if ($this->address_id) {
- $addressParams = array('id' => $this->address_id);
+ $addressParams = ['id' => $this->address_id];
$addressDetails = CRM_Core_BAO_Address::getValues($addressParams, FALSE, 'id');
$addressDetails = array_values($addressDetails);
}
// Else we assign the billing address of the contribution contact.
else {
- $addressParams = array('contact_id' => $this->contact_id, 'is_billing' => 1);
+ $addressParams = ['contact_id' => $this->contact_id, 'is_billing' => 1];
$addressDetails = (array) CRM_Core_BAO_Address::getValues($addressParams);
$addressDetails = array_values($addressDetails);
}
// This is precautionary as there are some legacy flows, but it should really be
// loaded by now.
if (!isset($this->_relatedObjects['contributionPage'])) {
- $this->loadRelatedEntitiesByID(array('contributionPage' => $this->contribution_page_id));
+ $this->loadRelatedEntitiesByID(['contributionPage' => $this->contribution_page_id]);
}
// CRM-8254 - override default currency if applicable
$config = CRM_Core_Config::singleton();
$lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($this->id);
if (!empty($lineItems)) {
$firstLineItem = reset($lineItems);
- $priceSet = array();
+ $priceSet = [];
if (CRM_Utils_Array::value('price_set_id', $firstLineItem)) {
- $priceSet = civicrm_api3('PriceSet', 'getsingle', array('id' => $firstLineItem['price_set_id'], 'return' => 'is_quick_config, id'));
+ $priceSet = civicrm_api3('PriceSet', 'getsingle', [
+ 'id' => $firstLineItem['price_set_id'],
+ 'return' => 'is_quick_config, id',
+ ]);
$values['priceSetID'] = $priceSet['id'];
}
foreach ($lineItems as &$eachItem) {
if (isset($this->_relatedObjects['membership'])
- && is_array($this->_relatedObjects['membership'])
- && array_key_exists($eachItem['membership_type_id'], $this->_relatedObjects['membership'])) {
+ && is_array($this->_relatedObjects['membership'])
+ && array_key_exists($eachItem['membership_type_id'], $this->_relatedObjects['membership'])) {
$eachItem['join_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['membership_type_id']]->join_date);
$eachItem['start_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['membership_type_id']]->start_date);
$eachItem['end_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['membership_type_id']]->end_date);
}
else {
// event
- $eventParams = array(
+ $eventParams = [
'id' => $this->_relatedObjects['event']->id,
- );
- $values['event'] = array();
+ ];
+ $values['event'] = [];
CRM_Event_BAO_Event::retrieve($eventParams, $values['event']);
// add custom fields for event
$eventGroupTree = CRM_Core_BAO_CustomGroup::getTree('Event', NULL, $this->_relatedObjects['event']->id);
- $eventCustomGroup = array();
+ $eventCustomGroup = [];
foreach ($eventGroupTree as $key => $group) {
if ($key === 'info') {
continue;
$values['event']['customGroup'] = $eventCustomGroup;
//get participant details
- $participantParams = array(
+ $participantParams = [
'id' => $this->_relatedObjects['participant']->id,
- );
+ ];
- $values['participant'] = array();
+ $values['participant'] = [];
CRM_Event_BAO_Participant::getValues($participantParams, $values['participant'], $participantIds);
// add custom fields for event
$participantGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', NULL, $this->_relatedObjects['participant']->id);
- $participantCustomGroup = array();
+ $participantCustomGroup = [];
foreach ($participantGroupTree as $key => $group) {
if ($key === 'info') {
continue;
$values['participant']['customGroup'] = $participantCustomGroup;
//get location details
- $locationParams = array(
+ $locationParams = [
'entity_id' => $this->_relatedObjects['event']->id,
'entity_table' => 'civicrm_event',
- );
+ ];
$values['location'] = CRM_Core_BAO_Location::getValues($locationParams);
- $ufJoinParams = array(
+ $ufJoinParams = [
'entity_table' => 'civicrm_event',
'entity_id' => $ids['event'],
'module' => 'CiviEvent',
- );
+ ];
list($custom_pre_id,
$custom_post_ids
$groupTree = CRM_Core_BAO_CustomGroup::getTree('Contribution', NULL, $this->id);
- $customGroup = array();
+ $customGroup = [];
foreach ($groupTree as $key => $group) {
if ($key === 'info') {
continue;
//assign honor information to receipt message
$softRecord = CRM_Contribute_BAO_ContributionSoft::getSoftContribution($this->id);
- $honorParams = ['soft_credit_type' => NULL, 'honor_block_is_active' => NULL];
+ $honorParams = [
+ 'soft_credit_type' => NULL,
+ 'honor_block_is_active' => NULL,
+ ];
if (isset($softRecord['soft_credit'])) {
//if id of contribution page is present
if (!empty($values['id'])) {
- $values['honor'] = array(
- 'honor_profile_values' => array(),
+ $values['honor'] = [
+ 'honor_profile_values' => [],
'honor_profile_id' => CRM_Core_DAO::getFieldValue('CRM_Core_DAO_UFJoin', $values['id'], 'uf_group_id', 'entity_id'),
'honor_id' => $softRecord['soft_credit'][1]['contact_id'],
- );
+ ];
$honorParams['soft_credit_type'] = $softRecord['soft_credit'][1]['soft_credit_type_label'];
$honorParams['honor_block_is_active'] = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_UFJoin', $values['id'], 'is_active', 'entity_id');
}
else {
//offline contribution
- $softCreditTypes = $softCredits = array();
+ $softCreditTypes = $softCredits = [];
foreach ($softRecord['soft_credit'] as $key => $softCredit) {
$softCreditTypes[$key] = $softCredit['soft_credit_type_label'];
- $softCredits[$key] = array(
+ $softCredits[$key] = [
'Name' => $softCredit['contact_name'],
'Amount' => CRM_Utils_Money::format($softCredit['amount'], $softCredit['currency']),
- );
+ ];
}
$template->assign('softCreditTypes', $softCreditTypes);
$template->assign('softCredits', $softCredits);
$values['amount'] = $this->total_amount;
}
- $pcpParams = ['pcpBlock' => NULL, 'pcp_display_in_roll' => NULL, 'pcp_roll_nickname' => NULL, 'pcp_personal_note' => NULL, 'title' => NULL];
+ $pcpParams = [
+ 'pcpBlock' => NULL,
+ 'pcp_display_in_roll' => NULL,
+ 'pcp_roll_nickname' => NULL,
+ 'pcp_personal_note' => NULL,
+ 'title' => NULL,
+ ];
if (strtolower($this->_component) == 'contribute') {
//PCP Info
if ($this->_component == 'event') {
$template->assign('title', $values['event']['title']);
$participantRoles = CRM_Event_PseudoConstant::participantRole();
- $viewRoles = array();
+ $viewRoles = [];
foreach (explode(CRM_Core_DAO::VALUE_SEPARATOR, $this->_relatedObjects['participant']->role_id) as $k => $v) {
$viewRoles[] = $participantRoles[$v];
}
$isTest = TRUE;
}
- $values['params'] = array();
+ $values['params'] = [];
//to get email of primary participant.
$primaryEmail = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Email', $this->_relatedObjects['participant']->contact_id, 'email', 'contact_id');
- $primaryAmount[] = array(
+ $primaryAmount[] = [
'label' => $this->_relatedObjects['participant']->fee_level . ' - ' . $primaryEmail,
'amount' => $this->_relatedObjects['participant']->fee_amount,
- );
+ ];
//build an array of cId/pId of participants
$additionalIDs = CRM_Event_BAO_Event::buildCustomProfile($this->_relatedObjects['participant']->id, NULL, $this->_relatedObjects['contact']->id, $isTest, TRUE);
unset($additionalIDs[$this->_relatedObjects['participant']->id]);
//set additionalParticipant true
$values['params']['additionalParticipant'] = TRUE;
foreach ($additionalIDs as $pId => $cId) {
- $amount = array();
+ $amount = [];
//to change the status pending to completed
$additional = new CRM_Event_DAO_Participant();
$additional->id = $pId;
if (!$additionalParticipantInfo) {
$additionalParticipantInfo = CRM_Contact_BAO_Contact::displayName($additional->contact_id);
}
- $amount[0] = array('label' => $additional->fee_level, 'amount' => $additional->fee_amount);
- $primaryAmount[] = array(
+ $amount[0] = [
+ 'label' => $additional->fee_level,
+ 'amount' => $additional->fee_amount,
+ ];
+ $primaryAmount[] = [
'label' => $additional->fee_level . ' - ' . $additionalParticipantInfo,
'amount' => $additional->fee_amount,
- );
+ ];
$additional->save();
$template->assign('amount', $amount);
CRM_Event_BAO_Event::sendMail($cId, $values, $pId, $isTest, $returnMessageText);
$cacheKeyString = "$contributionId";
$cacheKeyString .= $isNotCancelled ? '_1' : '_0';
- static $supportsCancel = array();
+ static $supportsCancel = [];
if (!array_key_exists($cacheKeyString, $supportsCancel)) {
$supportsCancel[$cacheKeyString] = FALSE;
FROM civicrm_contribution_recur cr
LEFT JOIN civicrm_contribution con ON ( cr.id = con.contribution_recur_id )
WHERE con.id = %1 LIMIT 1";
- $params = array(1 => array($contributionId, 'Integer'));
+ $params = [1 => [$contributionId, 'Integer']];
$statusId = CRM_Core_DAO::singleValueQuery($sql, $params);
$status = CRM_Contribute_PseudoConstant::contributionStatus($statusId);
if ($status == 'Cancelled') {
public static function recordFinancialAccounts(&$params, $financialTrxnValues = NULL) {
$skipRecords = $update = $return = $isRelatedId = FALSE;
- $additionalParticipantId = array();
+ $additionalParticipantId = [];
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$contributionStatus = empty($params['contribution_status_id']) ? NULL : $contributionStatuses[$params['contribution_status_id']];
!($contributionStatus == 'Pending' && !$params['contribution']->is_pay_later)
) {
$skipRecords = TRUE;
- $pendingStatus = array(
+ $pendingStatus = [
'Pending',
'In Progress',
- );
+ ];
if (in_array($contributionStatus, $pendingStatus)) {
$params['to_financial_account_id'] = CRM_Financial_BAO_FinancialAccount::getFinancialAccountForFinancialTypeByRelationship(
$params['financial_type_id'],
}
elseif (!empty($params['payment_processor'])) {
$params['to_financial_account_id'] = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($params['payment_processor'], NULL, 'civicrm_payment_processor');
- $params['payment_instrument_id'] = civicrm_api3('PaymentProcessor', 'getvalue', array(
+ $params['payment_instrument_id'] = civicrm_api3('PaymentProcessor', 'getvalue', [
'id' => $params['payment_processor'],
'return' => 'payment_instrument_id',
- ));
+ ]);
}
elseif (!empty($params['payment_instrument_id'])) {
$params['to_financial_account_id'] = CRM_Financial_BAO_FinancialTypeAccount::getInstrumentFinancialAccount($params['payment_instrument_id']);
}
else {
$relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('financial_account_type', NULL, " AND v.name LIKE 'Asset' "));
- $queryParams = array(1 => array($relationTypeId, 'Integer'));
+ $queryParams = [1 => [$relationTypeId, 'Integer']];
$params['to_financial_account_id'] = CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_financial_account WHERE is_default = 1 AND financial_account_type_id = %1", $queryParams);
}
$totalAmount = $params['total_amount'] = $params['prevContribution']->total_amount;
}
//build financial transaction params
- $trxnParams = array(
+ $trxnParams = [
'contribution_id' => $params['contribution']->id,
'to_financial_account_id' => $params['to_financial_account_id'],
'trxn_date' => !empty($params['contribution']->receive_date) ? $params['contribution']->receive_date : date('YmdHis'),
'net_amount' => CRM_Utils_Array::value('net_amount', $params, $totalAmount),
'currency' => $params['contribution']->currency,
'trxn_id' => $params['contribution']->trxn_id,
+ // @todo - this is getting the status id from the contribution - that is BAD - ie the contribution could be partially
+ // paid but each payment is completed. The work around is to pass in the status_id in the trxn_params but
+ // this should really default to completed (after discussion).
'status_id' => $statusId,
'payment_instrument_id' => CRM_Utils_Array::value('payment_instrument_id', $params, $params['contribution']->payment_instrument_id),
'check_number' => CRM_Utils_Array::value('check_number', $params),
'pan_truncation' => CRM_Utils_Array::value('pan_truncation', $params),
'card_type_id' => CRM_Utils_Array::value('card_type_id', $params),
- );
+ ];
if ($contributionStatus == 'Refunded' || $contributionStatus == 'Chargeback' || $contributionStatus == 'Cancelled') {
$trxnParams['trxn_date'] = !empty($params['contribution']->cancel_date) ? $params['contribution']->cancel_date : date('YmdHis');
if (isset($params['refund_trxn_id'])) {
if (isset($params['refund_trxn_id'])) {
$refundIDs = CRM_Core_BAO_FinancialTrxn::getRefundTransactionIDs($params['id']);
if (!empty($refundIDs['financialTrxnId']) && $refundIDs['trxn_id'] != $params['refund_trxn_id']) {
- civicrm_api3('FinancialTrxn', 'create', array('id' => $refundIDs['financialTrxnId'], 'trxn_id' => $params['refund_trxn_id']));
+ civicrm_api3('FinancialTrxn', 'create', [
+ 'id' => $refundIDs['financialTrxnId'],
+ 'trxn_id' => $params['refund_trxn_id'],
+ ]);
}
}
$cardType = CRM_Utils_Array::value('card_type_id', $params);
// create batch entry if batch_id is passed and
// ensure no batch entry is been made on 'Pending' or 'Failed' contribution, CRM-16611
if (!empty($params['batch_id']) && !empty($financialTxn)) {
- $entityParams = array(
+ $entityParams = [
'batch_id' => $params['batch_id'],
'entity_table' => 'civicrm_financial_trxn',
'entity_id' => $financialTxn->id,
- );
+ ];
CRM_Batch_BAO_EntityBatch::create($entityParams);
}
* @param array $params
* Contribution object, line item array and params for trxn.
*
- * @todo stop passing $params by reference. It is unclear the purpose of doing this &
- * adds unpredictability.
- *
* @param string $context
* Update scenarios.
*
+ * @todo stop passing $params by reference. It is unclear the purpose of doing this &
+ * adds unpredictability.
+ *
*/
public static function updateFinancialAccounts(&$params, $context = NULL) {
$trxnID = NULL;
) {
return;
}
- if ((($previousContributionStatus == 'Partially paid'
- && $currentContributionStatus == 'Completed')
- || ($previousContributionStatus == 'Pending' && $params['prevContribution']->is_pay_later == TRUE
- && $currentContributionStatus == 'Partially paid'))
+ // The 'right' way to add payments or refunds is through the Payment.create api. That api
+ // then updates the contribution but this process shoud not also record another financial trxn.
+ if ((($previousContributionStatus == 'Partially paid' && $currentContributionStatus == 'Completed')
+ || ($previousContributionStatus == 'Pending refund' && $currentContributionStatus == 'Completed')
+ // This concept of pay_later as different to any other sort of pending is deprecated & it's unclear
+ // why it is here or where it is handled instead.
+ || ($previousContributionStatus == 'Pending' && $params['prevContribution']->is_pay_later == TRUE
+ && $currentContributionStatus == 'Partially paid'))
&& $context == 'changedStatus'
) {
return;
$query = "UPDATE civicrm_financial_item SET status_id = %1 WHERE entity_id = %2 and entity_table = 'civicrm_line_item'";
$sql = "SELECT id, amount FROM civicrm_financial_item WHERE entity_id = %1 and entity_table = 'civicrm_line_item'";
- $entityParams = array(
+ $entityParams = [
'entity_table' => 'civicrm_financial_item',
- );
+ ];
foreach ($params['line_item'] as $fieldId => $fields) {
foreach ($fields as $fieldValueId => $lineItemDetails) {
- $fparams = array(
- 1 => array(CRM_Core_PseudoConstant::getKey('CRM_Financial_BAO_FinancialItem', 'status_id', 'Paid'), 'Integer'),
- 2 => array($lineItemDetails['id'], 'Integer'),
- );
+ $fparams = [
+ 1 => [
+ CRM_Core_PseudoConstant::getKey('CRM_Financial_BAO_FinancialItem', 'status_id', 'Paid'),
+ 'Integer',
+ ],
+ 2 => [$lineItemDetails['id'], 'Integer'],
+ ];
CRM_Core_DAO::executeQuery($query, $fparams);
- $fparams = array(
- 1 => array($lineItemDetails['id'], 'Integer'),
- );
+ $fparams = [
+ 1 => [$lineItemDetails['id'], 'Integer'],
+ ];
$financialItem = CRM_Core_DAO::executeQuery($sql, $fparams);
while ($financialItem->fetch()) {
$entityParams['entity_id'] = $financialItem->id;
$currency = $params['contribution']->currency;
}
$previousLineItemTotal = CRM_Utils_Array::value('line_total', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0);
- $itemParams = array(
+ $itemParams = [
'transaction_date' => $receiveDate,
'contact_id' => $params['prevContribution']->contact_id,
'currency' => $currency,
'financial_account_id' => $financialAccount,
'entity_table' => 'civicrm_line_item',
'entity_id' => $lineItemDetails['id'],
- );
+ ];
$financialItem = CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds);
// @todo we should stop passing $params by reference - splitting this out would be a step towards that.
$params['line_item'][$fieldId][$fieldValueId]['deferred_line_total'] = $itemParams['amount'];
elseif ($previousLineItemTotal != $lineItemDetails['line_total']) {
$taxAmount -= CRM_Utils_Array::value('tax_amount', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0);
}
- $itemParams['amount'] = self::getMultiplier($params['contribution']->contribution_status_id, $context) * $taxAmount;
- $itemParams['description'] = $taxTerm;
- if ($lineItemDetails['financial_type_id']) {
- $itemParams['financial_account_id'] = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount(
- $lineItemDetails['financial_type_id'],
- 'Sales Tax Account is'
- );
+ if ($taxAmount != 0) {
+ $itemParams['amount'] = self::getMultiplier($params['contribution']->contribution_status_id, $context) * $taxAmount;
+ $itemParams['description'] = $taxTerm;
+ if ($lineItemDetails['financial_type_id']) {
+ $itemParams['financial_account_id'] = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount(
+ $lineItemDetails['financial_type_id'],
+ 'Sales Tax Account is'
+ );
+ }
+ CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds);
}
- CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds);
}
}
}
* @return bool
*/
public static function isContributionStatusNegative($status_id) {
- $reversalStatuses = array('Cancelled', 'Chargeback', 'Refunded');
+ $reversalStatuses = ['Cancelled', 'Chargeback', 'Refunded'];
return in_array(CRM_Contribute_PseudoConstant::contributionStatus($status_id, 'name'), $reversalStatuses);
}
}
}
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
- $checkStatus = array(
- 'Cancelled' => array('Completed', 'Refunded'),
- 'Completed' => array('Cancelled', 'Refunded', 'Chargeback'),
- 'Pending' => array('Cancelled', 'Completed', 'Failed', 'Partially paid'),
- 'In Progress' => array('Cancelled', 'Completed', 'Failed'),
- 'Refunded' => array('Cancelled', 'Completed'),
- 'Partially paid' => array('Completed'),
- );
+ $checkStatus = [
+ 'Cancelled' => ['Completed', 'Refunded'],
+ 'Completed' => ['Cancelled', 'Refunded', 'Chargeback'],
+ 'Pending' => ['Cancelled', 'Completed', 'Failed', 'Partially paid'],
+ 'In Progress' => ['Cancelled', 'Completed', 'Failed'],
+ 'Refunded' => ['Cancelled', 'Completed'],
+ 'Partially paid' => ['Completed'],
+ ];
if (!in_array($contributionStatuses[$fields['contribution_status_id']],
- CRM_Utils_Array::value($contributionStatuses[$values['contribution_status_id']], $checkStatus, array()))
+ CRM_Utils_Array::value($contributionStatuses[$values['contribution_status_id']], $checkStatus, []))
) {
- $errors['contribution_status_id'] = ts("Cannot change contribution status from %1 to %2.", array(
+ $errors['contribution_status_id'] = ts("Cannot change contribution status from %1 to %2.", [
1 => $contributionStatuses[$values['contribution_status_id']],
2 => $contributionStatuses[$fields['contribution_status_id']],
- ));
+ ]);
}
}
/**
* Get options for a given contribution field.
- * @see CRM_Core_DAO::buildOptions
*
* @param string $fieldName
* @param string $context see CRM_Core_DAO::buildOptionsContext.
- * @param array $props whatever is known about this dao object.
+ * @param array $props whatever is known about this dao object.
*
* @return array|bool
+ * @see CRM_Core_DAO::buildOptions
+ *
*/
- public static function buildOptions($fieldName, $context = NULL, $props = array()) {
+ public static function buildOptions($fieldName, $context = NULL, $props = []) {
$className = __CLASS__;
- $params = array();
+ $params = [];
if (isset($props['orderColumn'])) {
$params['orderColumn'] = $props['orderColumn'];
}
$className = 'CRM_Contribute_BAO_ContributionPage';
// Filter results by contribution page
if (!empty($props['contribution_page_id'])) {
- $page = civicrm_api('contribution_page', 'getsingle', array(
+ $page = civicrm_api('contribution_page', 'getsingle', [
'version' => 3,
'id' => ($props['contribution_page_id']),
- ));
+ ]);
$types = (array) CRM_Utils_Array::value('payment_processor', $page, 0);
$params['condition'] = 'id IN (' . implode(',', $types) . ')';
}
$financialTrxn = CRM_Financial_BAO_Payment::recordPayment($contributionId, $trxnsData, $participantId);
}
elseif ($paymentType == 'refund') {
+ $trxnsData['total_amount'] = -$trxnsData['total_amount'];
$financialTrxn = CRM_Financial_BAO_Payment::recordRefundPayment($contributionId, $trxnsData, $updateStatus);
if ($participantId) {
// update participant status
}
if (!empty($financialTrxn)) {
- self::recordPaymentActivity($contributionId, $participantId, $financialTrxn);
+ self::recordPaymentActivity($contributionId, $participantId, $financialTrxn->total_amount, $financialTrxn->currency, $financialTrxn->trxn_date);
return $financialTrxn;
}
}
/**
- * @param $entityObj
- * @param $trxnObj
+ * @param int $targetCid
* @param $activityType
- * @param $component
+ * @param string $title
* @param int $contributionId
+ * @param string $totalAmount
+ * @param string $currency
+ * @param string $trxn_date
*
- * @throws CRM_Core_Exception
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
*/
- public static function addActivityForPayment($entityObj, $trxnObj, $activityType, $component, $contributionId) {
- if ($component == 'event') {
- $title = CRM_Core_DAO::getFieldValue('CRM_Event_BAO_Event', $entityObj->event_id, 'title');
- }
- else {
- $title = ts('Contribution');
- }
- $paymentAmount = CRM_Utils_Money::format($trxnObj->total_amount, $trxnObj->currency);
+ public static function addActivityForPayment($targetCid, $activityType, $title, $contributionId, $totalAmount, $currency, $trxn_date) {
+ $paymentAmount = CRM_Utils_Money::format($totalAmount, $currency);
$subject = "{$paymentAmount} - Offline {$activityType} for {$title}";
- $date = CRM_Utils_Date::isoToMysql($trxnObj->trxn_date);
- $targetCid = $entityObj->contact_id;
+ $date = CRM_Utils_Date::isoToMysql($trxn_date);
// source record id would be the contribution id
$srcRecId = $contributionId;
// activity params
- $activityParams = array(
+ $activityParams = [
'source_contact_id' => $targetCid,
'source_record_id' => $srcRecId,
'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', $activityType),
'activity_date_time' => $date,
'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_status_id', 'Completed'),
'skipRecentView' => TRUE,
- );
+ ];
// create activity with target contacts
$session = CRM_Core_Session::singleton();
$activityParams['source_contact_id'] = $id;
$activityParams['target_contact_id'][] = $targetCid;
}
- // @todo use api.
- CRM_Activity_BAO_Activity::create($activityParams);
+ civicrm_api3('Activity', 'create', $activityParams);
}
/**
$paymentBalance = CRM_Contribute_BAO_Contribution::getContributionBalance($contributionId, $total);
- $contribution = civicrm_api3('Contribution', 'getsingle', array('id' => $contributionId, 'return' => array('currency', 'is_pay_later', 'contribution_status_id', 'financial_type_id')));
+ $contribution = civicrm_api3('Contribution', 'getsingle', [
+ 'id' => $contributionId,
+ 'return' => [
+ 'currency',
+ 'is_pay_later',
+ 'contribution_status_id',
+ 'financial_type_id',
+ ],
+ ]);
$info['payLater'] = $contribution['is_pay_later'];
$info['contribution_status'] = $contribution['contribution_status'];
$info['balance'] = $paymentBalance;
$info['id'] = $id;
$info['component'] = $component;
- $rows = array();
+ $rows = [];
if ($getTrxnInfo && $baseTrxnId) {
// Need to exclude fee trxn rows so filter out rows where TO FINANCIAL ACCOUNT is expense account
$sql = "
WHERE con.id = %1 AND ft.is_payment = 1
GROUP BY ft.id";
- $queryParams = array(
- 1 => array($contributionId, 'Integer'),
- 2 => array($feeFinancialAccount, 'Integer'),
- );
+ $queryParams = [
+ 1 => [$contributionId, 'Integer'],
+ 2 => [$feeFinancialAccount, 'Integer'],
+ ];
$resultDAO = CRM_Core_DAO::executeQuery($sql, $queryParams);
$statuses = CRM_Contribute_PseudoConstant::contributionStatus();
// show payment edit link only for payments done via backoffice form
$paymentEditLink = '';
if (empty($resultDAO->payment_processor_id) && CRM_Core_Permission::check('edit contributions')) {
- $links = array(
- CRM_Core_Action::UPDATE => array(
+ $links = [
+ CRM_Core_Action::UPDATE => [
'name' => "<i class='crm-i fa-pencil'></i>",
'url' => 'civicrm/payment/edit',
'class' => 'medium-popup',
'qs' => "reset=1&id=%%id%%&contribution_id=%%contribution_id%%",
'title' => ts('Edit Payment'),
- ),
- );
+ ],
+ ];
$paymentEditLink = CRM_Core_Action::formLink(
$links,
- CRM_Core_Action::mask(array(CRM_Core_Permission::EDIT)),
- array(
+ CRM_Core_Action::mask([CRM_Core_Permission::EDIT]),
+ [
'id' => $resultDAO->id,
'contribution_id' => $contributionId,
- )
+ ]
);
}
- $val = array(
+ $val = [
'id' => $resultDAO->id,
'total_amount' => $resultDAO->total_amount,
'financial_type' => $resultDAO->financial_account,
'status' => $statuses[$resultDAO->status_id],
'currency' => $resultDAO->currency,
'action' => $paymentEditLink,
- );
+ ];
if ($paidByName == 'Check') {
$val['check_number'] = $resultDAO->check_number;
}
$params['prevContribution'] = self::getOriginalContribution($params['id']);
}
- foreach (array('total_amount', 'financial_type_id', 'fee_amount') as $field) {
+ foreach (['total_amount', 'financial_type_id', 'fee_amount'] as $field) {
if (!isset($params[$field])) {
if ($field == 'total_amount' && $params['prevContribution']->tax_amount) {
// Tax amount gets added back on later....
// Assign tax Amount on update of contribution
if (!empty($params['prevContribution']->tax_amount)) {
$params['tax_amount'] = 'null';
- CRM_Price_BAO_LineItem::getLineItemArray($params, array($params['id']));
+ CRM_Price_BAO_LineItem::getLineItemArray($params, [$params['id']]);
foreach ($params['line_item'] as $setID => $priceField) {
foreach ($priceField as $priceFieldID => $priceFieldValue) {
$params['line_item'][$setID][$priceFieldID]['tax_amount'] = $params['tax_amount'];
// Get Line Item on update of contribution
if (isset($params['id'])) {
- CRM_Price_BAO_LineItem::getLineItemArray($params, array($params['id']));
+ CRM_Price_BAO_LineItem::getLineItemArray($params, [$params['id']]);
}
else {
CRM_Price_BAO_LineItem::getLineItemArray($params);
}
elseif (isset($params['api.line_item.create'])) {
// Update total amount of contribution using lineItem
- $taxAmountArray = array();
+ $taxAmountArray = [];
foreach ($params['api.line_item.create'] as $key => $value) {
if (isset($value['financial_type_id']) && array_key_exists($value['financial_type_id'], $taxRates)) {
$taxRate = $taxRates[$value['financial_type_id']];
}
else {
// update line item of contrbution
- if (isset($params['financial_type_id']) && array_key_exists($params['financial_type_id'], $taxRates) && $isLineItem) {
+ if (isset($params['financial_type_id']) && array_key_exists($params['financial_type_id'], $taxRates) && $isLineItem) {
$taxRate = $taxRates[$params['financial_type_id']];
$taxAmount = CRM_Contribute_BAO_Contribution_Utils::calculateTaxAmount($params['line_total'], $taxRate, $unknownIfMoneyIsClean);
$params['tax_amount'] = round($taxAmount['tax_amount'], 2);
}
}
$sql = 'SELECT financial_type_id FROM civicrm_line_item WHERE contribution_id = %1 GROUP BY financial_type_id;';
- $params = array(
- '1' => array($contributionId, 'Integer'),
- );
+ $params = [
+ '1' => [$contributionId, 'Integer'],
+ ];
$result = CRM_Core_DAO::executeQuery($sql, $params);
if ($result->N > 1) {
$errors['financial_type_id'] = ts('One or more line items have a different financial type than the contribution. Editing the financial type is not yet supported in this situation.');
if ($updatePledgePaymentStatus) {
CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeID,
- array($pledgePaymentID),
+ [$pledgePaymentID],
$contribution_status_id,
NULL,
$total_amount,
/**
* Compute the stats values
*
- * @deprecated
- *
* @param string $stat either 'mode' or 'median'
* @param string $sql
* @param string $alias of civicrm_contribution
*
* @return array|null
+ * @deprecated
+ *
*/
public static function computeStats($stat, $sql, $alias = NULL) {
CRM_Core_Error::deprecatedFunctionWarning('computeStats is now deprecated');
* @throws \CiviCRM_API3_Exception
*/
public static function isSingleLineItem($id) {
- $lineItemCount = civicrm_api3('LineItem', 'getcount', array('contribution_id' => $id));
+ $lineItemCount = civicrm_api3('LineItem', 'getcount', ['contribution_id' => $id]);
return ($lineItemCount == 1);
}
$primaryContributionID = isset($contribution->id) ? $contribution->id : $objects['first_contribution']->id;
// The previous details are used when calculating line items so keep it before any code that 'does something'
if (!empty($contribution->id)) {
- $input['prevContribution'] = CRM_Contribute_BAO_Contribution::getValues(array('id' => $contribution->id),
+ $input['prevContribution'] = CRM_Contribute_BAO_Contribution::getValues(['id' => $contribution->id],
CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
}
- $inputContributionWhiteList = array(
+ $inputContributionWhiteList = [
'fee_amount',
'net_amount',
'trxn_id',
'contribution_status_id',
'card_type_id',
'pan_truncation',
- );
+ ];
if (self::isSingleLineItem($primaryContributionID)) {
$inputContributionWhiteList[] = 'financial_type_id';
}
$completedContributionStatusID = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
- $contributionParams = array_merge(array(
+ $contributionParams = array_merge([
'contribution_status_id' => $completedContributionStatusID,
'source' => self::getRecurringContributionDescription($contribution, $event),
- ), array_intersect_key($input, array_fill_keys($inputContributionWhiteList, 1)
+ ], array_intersect_key($input, array_fill_keys($inputContributionWhiteList, 1)
));
// CRM-20678 Ensure that the currency is correct in subseqent transcations.
self::repeatTransaction($contribution, $input, $contributionParams, $paymentProcessorId);
$contributionParams['financial_type_id'] = $contribution->financial_type_id;
- $values = array();
+ $values = [];
if (isset($input['is_email_receipt'])) {
$values['is_email_receipt'] = $input['is_email_receipt'];
}
CRM_Contribute_BAO_ContributionRecur::addrecurSoftCredit($objects['contributionRecur']->id, $contribution->id);
}
- $contributionStatuses = CRM_Core_PseudoConstant::get('CRM_Contribute_DAO_Contribution', 'contribution_status_id', array(
+ $contributionStatuses = CRM_Core_PseudoConstant::get('CRM_Contribute_DAO_Contribution', 'contribution_status_id', [
'labelColumn' => 'name',
'flip' => 1,
- ));
+ ]);
if (isset($input['prevContribution']) && (!$input['prevContribution']->is_pay_later && $input['prevContribution']->contribution_status_id == $contributionStatuses['Pending'])) {
$input['payment_processor'] = $paymentProcessorId;
}
if (!array_key_exists('is_email_receipt', $values) ||
$values['is_email_receipt'] == 1
) {
- civicrm_api3('Contribution', 'sendconfirmation', array(
+ civicrm_api3('Contribution', 'sendconfirmation', [
'id' => $contribution->id,
'payment_processor_id' => $paymentProcessorId,
- ));
+ ]);
CRM_Core_Error::debug_log_message("Receipt sent");
}
$values['contribution_status'] = CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $contribution->contribution_status_id);
$return = $contribution->composeMessageArray($input, $ids, $values, $returnMessageText);
if ((!isset($input['receipt_update']) || $input['receipt_update']) && empty($contribution->receipt_date)) {
- civicrm_api3('Contribution', 'create', array('receipt_date' => 'now', 'id' => $contribution->id));
+ civicrm_api3('Contribution', 'create', [
+ 'receipt_date' => 'now',
+ 'id' => $contribution->id,
+ ]);
}
return $return;
}
/**
* Generate From email and from name in an array values
+ *
* @param array $input
* @param \CRM_Contribute_BAO_Contribution $contribution
+ *
* @return array
*/
public static function generateFromEmailAndName($input, $contribution) {
// Use input value if supplied.
if (!empty($input['receipt_from_email'])) {
- return array(CRM_Utils_array::value('receipt_from_name', $input, ''), $input['receipt_from_email']);
+ return [
+ CRM_Utils_array::value('receipt_from_name', $input, ''),
+ $input['receipt_from_email'],
+ ];
}
// if we are still empty see if we can use anything from a contribution page.
- $pageValues = array();
+ $pageValues = [];
if (!empty($contribution->contribution_page_id)) {
- $pageValues = civicrm_api3('ContributionPage', 'getsingle', array('id' => $contribution->contribution_page_id));
+ $pageValues = civicrm_api3('ContributionPage', 'getsingle', ['id' => $contribution->contribution_page_id]);
}
// if we are still empty see if we can use anything from a contribution page.
if (!empty($pageValues['receipt_from_email'])) {
- return array($pageValues['receipt_from_name'], $pageValues['receipt_from_email']);
+ return [
+ $pageValues['receipt_from_name'],
+ $pageValues['receipt_from_email'],
+ ];
}
// If we are still empty fall back to the domain or logged in user information.
return CRM_Core_BAO_Domain::getDefaultReceiptFrom();
do {
$creditNoteNum++;
$creditNoteId = CRM_Utils_Array::value('credit_notes_prefix', $prefixValue) . "" . $creditNoteNum;
- $result = civicrm_api3('Contribution', 'getcount', array(
+ $result = civicrm_api3('Contribution', 'getcount', [
'sequential' => 1,
'creditnote_id' => $creditNoteId,
- ));
+ ]);
} while ($result > 0);
return $creditNoteId;
/**
* Load related memberships.
*
+ * @param array $ids
+ *
+ * @return array $ids
+ *
+ * @throws Exception
* @deprecated
*
* Note that in theory it should be possible to retrieve these from the line_item table
*
* I don't know if it never worked or broke as a result of https://issues.civicrm.org/jira/browse/CRM-14918.
*
- * @param array $ids
- *
- * @return array $ids
- *
- * @throws Exception
*/
public function loadRelatedMembershipObjects($ids = []) {
$query = "
SELECT membership_id
FROM civicrm_membership_payment
WHERE contribution_id = %1 ";
- $params = array(1 => array($this->id, 'Integer'));
- $ids['membership'] = (array) CRM_Utils_Array::value('membership', $ids, array());
+ $params = [1 => [$this->id, 'Integer']];
+ $ids['membership'] = (array) CRM_Utils_Array::value('membership', $ids, []);
$dao = CRM_Core_DAO::executeQuery($query, $params);
while ($dao->fetch()) {
return $contribution->source;
}
elseif (!empty($contribution->contribution_page_id) && is_numeric($contribution->contribution_page_id)) {
- $contributionPageTitle = civicrm_api3('ContributionPage', 'getvalue', array(
+ $contributionPageTitle = civicrm_api3('ContributionPage', 'getvalue', [
'id' => $contribution->contribution_page_id,
'return' => 'title',
- ));
+ ]);
return ts('Online Contribution') . ': ' . $contributionPageTitle;
}
elseif ($event) {
FROM civicrm_financial_trxn ft
INNER JOIN civicrm_entity_financial_trxn eft ON eft.financial_trxn_id = ft.id AND eft.entity_table = 'civicrm_contribution'
WHERE eft.entity_id = %1 AND ft.is_payment = 1 ORDER BY ft.id DESC LIMIT 1";
- $contributionStatus = CRM_Core_PseudoConstant::get('CRM_Contribute_DAO_Contribution', 'contribution_status_id', array(
+ $contributionStatus = CRM_Core_PseudoConstant::get('CRM_Contribute_DAO_Contribution', 'contribution_status_id', [
'labelColumn' => 'name',
- ));
+ ]);
foreach ($contributions as $contribution) {
if (!($contributionStatus[$contribution->contribution_status_id] == 'Partially paid'
|| CRM_Utils_Array::value($contributionStatusId, $contributionStatus) == 'Partially paid')
) {
continue;
}
- $ftDao = CRM_Core_DAO::executeQuery($ftSql, array(1 => array($contribution->id, 'Integer')));
+ $ftDao = CRM_Core_DAO::executeQuery($ftSql, [
+ 1 => [
+ $contribution->id,
+ 'Integer',
+ ],
+ ]);
$ftDao->fetch();
// store financial item Proportionaly.
- $trxnParams = array(
+ $trxnParams = [
'total_amount' => $ftDao->total_amount,
'contribution_id' => $contribution->id,
- );
+ ];
self::assignProportionalLineItems($trxnParams, $ftDao->id, $contribution->total_amount);
}
}
if (!empty($lineItems)) {
// get financial item
list($ftIds, $taxItems) = self::getLastFinancialItemIds($trxnParams['contribution_id']);
- $entityParams = array(
+ $entityParams = [
'contribution_total_amount' => $contributionTotalAmount,
'trxn_total_amount' => $trxnParams['total_amount'],
'trxn_id' => $trxnId,
- );
+ ];
self::createProportionalFinancialEntries($entityParams, $lineItems, $ftIds, $taxItems);
}
}
}
$contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus($params['contribution_status_id'], 'name');
- $preferredAccountsRelationships = array(
+ $preferredAccountsRelationships = [
'Refunded' => 'Credit/Contra Revenue Account is',
'Chargeback' => 'Chargeback Account is',
- );
+ ];
if (in_array($contributionStatus, array_keys($preferredAccountsRelationships))) {
$financialTypeID = !empty($params['financial_type_id']) ? $params['financial_type_id'] : $params['prevContribution']->financial_type_id;
* @return array
*/
protected function addContributionPageValuesToValuesHeavyHandedly(&$values) {
- $contributionPageValues = array();
+ $contributionPageValues = [];
CRM_Contribute_BAO_ContributionPage::setValues(
$this->contribution_page_id,
$contributionPageValues
);
- $valuesToCopy = array(
+ $valuesToCopy = [
// These are the values that I believe to be useful.
'id',
'title',
'thankyou_text',
'thankyou_title',
- );
+ ];
foreach ($valuesToCopy as $valueToCopy) {
if (isset($contributionPageValues[$valueToCopy])) {
$values[$valueToCopy] = $contributionPageValues[$valueToCopy];
return $statusMsg;
}
- $params = array(
+ $params = [
'contribution_id' => $contributionId,
'contribution_status_id' => $statusId,
'previous_contribution_status_id' => $previousStatusId,
'receive_date' => $receiveDate,
- );
+ ];
$updateResult = CRM_Contribute_BAO_Contribution::transitionComponents($params);
break;
}
- $statusMsg .= "<br />" . ts("Membership for %1 has been %2.", array(1 => $userDisplayName, 2 => $statusNameMsgPart));
+ $statusMsg .= "<br />" . ts("Membership for %1 has been %2.", [
+ 1 => $userDisplayName,
+ 2 => $statusNameMsgPart,
+ ]);
}
if ($componentName == 'CiviEvent') {
CRM_Event_PseudoConstant::participantStatus()
);
if ($updatedStatusName == 'Cancelled') {
- $statusMsg .= "<br />" . ts("Event Registration for %1 has been Cancelled.", array(1 => $userDisplayName));
+ $statusMsg .= "<br />" . ts("Event Registration for %1 has been Cancelled.", [1 => $userDisplayName]);
}
elseif ($updatedStatusName == 'Registered') {
- $statusMsg .= "<br />" . ts("Event Registration for %1 has been updated.", array(1 => $userDisplayName));
+ $statusMsg .= "<br />" . ts("Event Registration for %1 has been updated.", [1 => $userDisplayName]);
}
}
CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name')
);
if ($updatedStatusName == 'Cancelled') {
- $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been Cancelled.", array(1 => $userDisplayName));
+ $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been Cancelled.", [1 => $userDisplayName]);
}
elseif ($updatedStatusName == 'Failed') {
- $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been Failed.", array(1 => $userDisplayName));
+ $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been Failed.", [1 => $userDisplayName]);
}
elseif ($updatedStatusName == 'Completed') {
- $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been updated.", array(1 => $userDisplayName));
+ $statusMsg .= "<br />" . ts("Pledge Payment for %1 has been updated.", [1 => $userDisplayName]);
}
}
}
* @return \CRM_Contribute_BAO_Contribution|null
*/
private static function getOriginalContribution($contributionID) {
- return self::getValues(array('id' => $contributionID), CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
+ return self::getValues(['id' => $contributionID], CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray);
}
/**
* for historical reasons. Going forwards we can hope to add tests & improve readibility
* of that function
*
- * @todo move recordFinancialAccounts & helper functions to their own class?
- *
* @param array $params
* Params as passed to contribution.create
*
* @param int $previousLineItemTotal
*
* @return float
+ * @todo move recordFinancialAccounts & helper functions to their own class?
+ *
*/
protected static function getFinancialItemAmountFromParams($params, $context, $lineItemDetails, $isARefund, $previousLineItemTotal) {
if ($context == 'changedAmount') {
elseif (empty($lineItemDetails['line_total'])) {
// follow legacy code path
Civi::log()
- ->warning('Deprecated bit of code, please log a ticket explaining how you got here!', array('civi.tag' => 'deprecated'));
+ ->warning('Deprecated bit of code, please log a ticket explaining how you got here!', ['civi.tag' => 'deprecated']);
return $params['total_amount'];
}
else {
public static function updateMembershipBasedOnCompletionOfContribution($contribution, $primaryContributionID, $changeDate) {
$memberships = self::getRelatedMemberships($contribution->id);
foreach ($memberships as $membership) {
- $membershipParams = array(
+ $membershipParams = [
'id' => $membership['id'],
'contact_id' => $membership['contact_id'],
'is_test' => $membership['is_test'],
'membership_type_id' => $membership['membership_type_id'],
'membership_activity_status' => 'Completed',
- );
+ ];
$currentMembership = CRM_Member_BAO_Membership::getContactMembership($membershipParams['contact_id'],
$membershipParams['membership_type_id'],
);
// @todo remove all this stuff in favour of letting the api call further down handle in
// (it is a duplication of what the api does).
- $dates = array_fill_keys(array(
+ $dates = array_fill_keys([
'join_date',
'start_date',
'end_date',
- ), NULL);
+ ], NULL);
if ($currentMembership) {
/*
* Fixed FOR CRM-4433
// but not for Failed contributions, where we don't accept additional payments at the moment.
// (in some cases the contribution is 'Pending' and only the payment is failed. In those we
// do accept more payments agains them.
- return array();
+ return [];
}
- $actionLinks = array();
+ $actionLinks = [];
if ((int) $balance > 0) {
if (CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) {
- $actionLinks[] = array(
- 'url' => CRM_Utils_System::url('civicrm/payment', array(
+ $actionLinks[] = [
+ 'url' => CRM_Utils_System::url('civicrm/payment', [
'action' => 'add',
'reset' => 1,
'id' => $id,
'mode' => 'live',
- )),
+ ]),
'title' => ts('Submit Credit Card payment'),
- );
+ ];
}
- $actionLinks[] = array(
- 'url' => CRM_Utils_System::url('civicrm/payment', array(
+ $actionLinks[] = [
+ 'url' => CRM_Utils_System::url('civicrm/payment', [
'action' => 'add',
'reset' => 1,
'id' => $id,
- )),
+ ]),
'title' => ts('Record Payment'),
- );
+ ];
}
elseif ((int) $balance < 0) {
- $actionLinks[] = array(
- 'url' => CRM_Utils_System::url('civicrm/payment', array(
+ $actionLinks[] = [
+ 'url' => CRM_Utils_System::url('civicrm/payment', [
'action' => 'add',
'reset' => 1,
'id' => $id,
- )),
+ ]),
'title' => ts('Record Refund'),
- );
+ ];
}
return $actionLinks;
}
* @return null
*/
public static function recordAlwaysAccountsReceivable(&$trxnParams, $contributionParams) {
- if (!self::checkContributeSettings('always_post_to_accounts_receivable')) {
+ if (!Civi::settings()->get('always_post_to_accounts_receivable')) {
return NULL;
}
$statusId = $contributionParams['contribution']->contribution_status_id;
$previousContributionStatus = empty($contributionParams['prevContribution']) ? NULL : $contributionStatuses[$contributionParams['prevContribution']->contribution_status_id];
// Return if contribution status is not completed.
if (!($contributionStatus == 'Completed' && (empty($previousContributionStatus)
- || (!empty($previousContributionStatus) && $previousContributionStatus == 'Pending'
- && $contributionParams['prevContribution']->is_pay_later == 0
- )))
+ || (!empty($previousContributionStatus) && $previousContributionStatus == 'Pending'
+ && $contributionParams['prevContribution']->is_pay_later == 0
+ )))
) {
return NULL;
}
INNER JOIN civicrm_financial_account cfa ON ce.financial_account_id = cfa.id
WHERE `entity_table` = 'civicrm_financial_type' AND cfa.is_tax = 1 AND ce.account_relationship = %1 GROUP BY cfa.id";
$accountRel = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Sales Tax Account is' "));
- $queryParams = array(1 => array($accountRel, 'Integer'));
+ $queryParams = [1 => [$accountRel, 'Integer']];
$dao = CRM_Core_DAO::executeQuery($query, $queryParams);
- $financialAccount = array();
+ $financialAccount = [];
while ($dao->fetch()) {
$financialAccount[$dao->id] = $dao->id;
}
*
* @param array $eftParams
*
+ * @throws \CiviCRM_API3_Exception
*/
public static function createProportionalEntry($entityParams, $eftParams) {
$paid = 0;
FROM civicrm_financial_item fi
INNER JOIN civicrm_line_item li ON li.id = fi.entity_id and fi.entity_table = 'civicrm_line_item'
WHERE li.contribution_id = %1";
- $dao = CRM_Core_DAO::executeQuery($sql, array(1 => array($contributionId, 'Integer')));
- $ftIds = $taxItems = array();
+ $dao = CRM_Core_DAO::executeQuery($sql, [
+ 1 => [
+ $contributionId,
+ 'Integer',
+ ],
+ ]);
+ $ftIds = $taxItems = [];
$salesTaxFinancialAccount = self::getSalesTaxFinancialAccounts();
while ($dao->fetch()) {
/* if sales tax item*/
if (in_array($dao->financial_account_id, $salesTaxFinancialAccount)) {
- $taxItems[$dao->price_field_value_id] = array(
+ $taxItems[$dao->price_field_value_id] = [
'financial_item_id' => $dao->id,
'amount' => $dao->tax_amount,
- );
+ ];
}
else {
$ftIds[$dao->price_field_value_id] = $dao->id;
}
}
- return array($ftIds, $taxItems);
+ return [$ftIds, $taxItems];
}
/**
*
* @param array $taxItems
*
+ * @throws \CiviCRM_API3_Exception
*/
public static function createProportionalFinancialEntries($entityParams, $lineItems, $ftIds, $taxItems) {
- $eftParams = array(
+ $eftParams = [
'entity_table' => 'civicrm_financial_item',
'financial_trxn_id' => $entityParams['trxn_id'],
- );
+ ];
foreach ($lineItems as $key => $value) {
if ($value['qty'] == 0) {
continue;
* @throws \CRM_Core_Exception
*/
protected function loadRelatedEntitiesByID($ids) {
- $entities = array(
+ $entities = [
'contact' => 'CRM_Contact_BAO_Contact',
'contributionRecur' => 'CRM_Contribute_BAO_ContributionRecur',
'contributionType' => 'CRM_Financial_BAO_FinancialType',
'financialType' => 'CRM_Financial_BAO_FinancialType',
'contributionPage' => 'CRM_Contribute_BAO_ContributionPage',
- );
+ ];
foreach ($entities as $entity => $bao) {
if (!empty($ids[$entity])) {
$this->_relatedObjects[$entity] = new $bao();
* @param bool $escapeSmarty
*
* @return array
+ * @throws \CiviCRM_API3_Exception
*/
public static function replaceContributionTokens(
$contributionIds,
$escapeSmarty
) {
if (empty($contributionIds)) {
- return array();
+ return [];
}
- $contributionDetails = array();
+ $contributionDetails = [];
foreach ($contributionIds as $id) {
- $result = civicrm_api3('Contribution', 'get', array('id' => $id));
+ $result = civicrm_api3('Contribution', 'get', ['id' => $id]);
$contributionDetails[$result['values'][$result['id']]['contact_id']]['subject'] = CRM_Utils_Token::replaceContributionTokens($subject, $result, FALSE, $subjectToken, FALSE, $escapeSmarty);
$contributionDetails[$result['values'][$result['id']]['contact_id']]['text'] = CRM_Utils_Token::replaceContributionTokens($text, $result, FALSE, $messageToken, FALSE, $escapeSmarty);
$contributionDetails[$result['values'][$result['id']]['contact_id']]['html'] = CRM_Utils_Token::replaceContributionTokens($html, $result, FALSE, $messageToken, FALSE, $escapeSmarty);
'title' => ts('Copy of') . ' ',
],
];
- $copy = &CRM_Core_DAO::copyGeneric('CRM_Contribute_DAO_ContributionPage', [
+ $copy = CRM_Core_DAO::copyGeneric('CRM_Contribute_DAO_ContributionPage', [
'id' => $id,
], NULL, $fieldsFix);
//copying all the blocks pertaining to the contribution page
- $copyPledgeBlock = &CRM_Core_DAO::copyGeneric('CRM_Pledge_DAO_PledgeBlock', [
+ $copyPledgeBlock = CRM_Core_DAO::copyGeneric('CRM_Pledge_DAO_PledgeBlock', [
'entity_id' => $id,
'entity_table' => 'civicrm_contribution_page',
], [
'entity_id' => $copy->id,
]);
- $copyMembershipBlock = &CRM_Core_DAO::copyGeneric('CRM_Member_DAO_MembershipBlock', [
+ $copyMembershipBlock = CRM_Core_DAO::copyGeneric('CRM_Member_DAO_MembershipBlock', [
'entity_id' => $id,
'entity_table' => 'civicrm_contribution_page',
], [
'entity_id' => $copy->id,
]);
- $copyUFJoin = &CRM_Core_DAO::copyGeneric('CRM_Core_DAO_UFJoin', [
+ $copyUFJoin = CRM_Core_DAO::copyGeneric('CRM_Core_DAO_UFJoin', [
'entity_id' => $id,
'entity_table' => 'civicrm_contribution_page',
], [
'entity_id' => $copy->id,
]);
- $copyWidget = &CRM_Core_DAO::copyGeneric('CRM_Contribute_DAO_Widget', [
+ $copyWidget = CRM_Core_DAO::copyGeneric('CRM_Contribute_DAO_Widget', [
'contribution_page_id' => $id,
], [
'contribution_page_id' => $copy->id,
//copy price sets
CRM_Price_BAO_PriceSet::copyPriceSet('civicrm_contribution_page', $id, $copy->id);
- $copyTellFriend = &CRM_Core_DAO::copyGeneric('CRM_Friend_DAO_Friend', [
+ $copyTellFriend = CRM_Core_DAO::copyGeneric('CRM_Friend_DAO_Friend', [
'entity_id' => $id,
'entity_table' => 'civicrm_contribution_page',
], [
'entity_id' => $copy->id,
]);
- $copyPersonalCampaignPages = &CRM_Core_DAO::copyGeneric('CRM_PCP_DAO_PCPBlock', [
+ $copyPersonalCampaignPages = CRM_Core_DAO::copyGeneric('CRM_PCP_DAO_PCPBlock', [
'entity_id' => $id,
'entity_table' => 'civicrm_contribution_page',
], [
'target_entity_id' => $copy->id,
]);
- $copyPremium = &CRM_Core_DAO::copyGeneric('CRM_Contribute_DAO_Premium', [
+ $copyPremium = CRM_Core_DAO::copyGeneric('CRM_Contribute_DAO_Premium', [
'entity_id' => $id,
'entity_table' => 'civicrm_contribution_page',
], [
* @return bool
*/
public static function cancelRecurContribution($params) {
- if (is_int($params)) {
+ if (is_numeric($params)) {
CRM_Core_Error::deprecatedFunctionWarning('You are using a BAO function whose signature has changed. Please use the ContributionRecur.cancel api');
$params = ['id' => $params];
}
* Associative array of contribution fields
*/
public static function getFields($checkPermission = TRUE) {
- if (!isset(\Civi::$statics[__CLASS__]) || !isset(\Civi::$statics[__CLASS__]['fields']) || !isset(\Civi::$statics[__CLASS__]['contribution'])) {
- $fields = CRM_Contribute_BAO_Contribution::exportableFields($checkPermission);
+ if (!isset(\Civi::$statics[__CLASS__]) || !isset(\Civi::$statics[__CLASS__]['fields']) || !isset(\Civi::$statics[__CLASS__]['fields']['contribution'])) {
+ // Adding fields with some care as those without unique names could clobber others.
+ // Refer to CRM_Contribute_Form_SearchTest for existing tests ... and to add more!
+ $testedRecurFields = array_fill_keys(['contribution_recur_trxn_id', 'contribution_recur_processor_id', 'contribution_recur_payment_processor_id'], 1);
+ $recurFields = array_intersect_key(CRM_Contribute_DAO_ContributionRecur::fields(), $testedRecurFields);
+ $fields = array_merge($recurFields, CRM_Contribute_BAO_Contribution::exportableFields($checkPermission));
CRM_Contribute_BAO_Contribution::appendPseudoConstantsToFields($fields);
unset($fields['contribution_contact_id']);
\Civi::$statics[__CLASS__]['fields']['contribution'] = $fields;
case 'contribution_recur_processor_id':
case 'contribution_recur_trxn_id':
- $fieldName = str_replace('contribution_recur_', '', $name);
- $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("civicrm_contribution_recur.{$fieldName}",
+ $spec = $fields[$name];
+ $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause($spec['where'],
$op, $value, "String"
);
- $recurFields = CRM_Contribute_DAO_ContributionRecur::fields();
- $query->_qill[$grouping][] = ts("Recurring Contribution %1 %2 '%3'", [1 => $recurFields[$fieldName]['title'], 2 => $op, 3 => $value]);
- $query->_tables['civicrm_contribution_recur'] = $query->_whereTables['civicrm_contribution_recur'] = 1;
+ $query->_qill[$grouping][] = ts("Recurring Contribution %1 %2 '%3'", [1 => $fields[$name]['title'], 2 => $op, 3 => $value]);
+ $query->_tables[$spec['table_name']] = $query->_whereTables[$spec['table_name']] = 1;
return;
case 'contribution_recur_payment_made':
default:
//all other elements are handle in this case
$fldName = substr($name, 13);
- CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($financialTypes);
- $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("civicrm_contribution.financial_type_id", 'IN', array_keys($financialTypes), 'String');
if (!isset($fields[$fldName])) {
// CRM-12597
CRM_Core_Session::setStatus(ts(
$now = time();
if ($dao->start_date) {
$startDate = CRM_Utils_Date::unixTime($dao->start_date);
+ $data['start_date'] = $dao->start_date;
if ($startDate && $startDate >= $now) {
$data['is_active'] = FALSE;
$data['campaign_start'] = ts('Campaign starts on %1', [
if ($dao->end_date) {
$endDate = CRM_Utils_Date::unixTime($dao->end_date);
+ $data['end_date'] = $dao->end_date;
if ($endDate &&
$endDate < $now
) {
*
* Generated from xml/schema/CRM/Contribute/Contribution.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:99cdf75ae6e6bf73bc5ff6871a3baf82)
+ * (GenCodeChecksum:7a81b495b5661ae881321938d4ee38c9)
*/
/**
/**
* Contribution ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to Financial Type for (total_amount - non_deductible_amount).
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* The Contribution Page which triggered this contribution
*
- * @var int unsigned
+ * @var int
*/
public $contribution_page_id;
/**
* FK to Payment Instrument
*
- * @var int unsigned
+ * @var int
*/
public $payment_instrument_id;
/**
* Conditional foreign key to civicrm_contribution_recur id. Each contribution made in connection with a recurring contribution carries a foreign key to the recurring contribution record. This assumes we can track these processor initiated events.
*
- * @var int unsigned
+ * @var int
*/
public $contribution_recur_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
- * @var boolean
+ * @var bool
*/
public $is_pay_later;
/**
- * @var int unsigned
+ * @var int
*/
public $contribution_status_id;
/**
* Conditional foreign key to civicrm_address.id. We insert an address record for each contribution when we have associated billing name and address data.
*
- * @var int unsigned
+ * @var int
*/
public $address_id;
/**
* The campaign for which this contribution has been triggered.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'contribution_page_id' => [
'name' => 'contribution_page_id',
'table' => 'civicrm_contribution_page',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'payment_instrument_id' => [
'name' => 'payment_instrument_id',
'pseudoconstant' => [
'optionGroupName' => 'payment_instrument',
'optionEditPath' => 'civicrm/admin/options/payment_instrument',
- ]
+ ],
],
'receive_date' => [
'name' => 'receive_date',
'description' => ts('Portion of total amount which is NOT tax deductible. Equal to total_amount for non-deductible financial types.'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_contribution.non_deductible_amount',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_contribution.total_amount',
'description' => ts('actual processor fee if known - may be 0.'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_contribution.fee_amount',
'description' => ts('actual funds transfer amount. total less fees. if processor does not report actual fee during transaction, this is set to total_amount.'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_contribution.net_amount',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'cancel_date' => [
'name' => 'cancel_date',
'pseudoconstant' => [
'optionGroupName' => 'contribution_status',
'optionEditPath' => 'civicrm/admin/options/contribution_status',
- ]
+ ],
],
'contribution_address_id' => [
'name' => 'address_id',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'creditnote_id' => [
'name' => 'creditnote_id',
'description' => ts('Total tax amount of this contribution.'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_contribution.tax_amount',
*
* Generated from xml/schema/CRM/Contribute/ContributionPage.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:923a4b6d8829d7aa6cc24e18d62114ff)
+ * (GenCodeChecksum:c6e11bf69550f2253d2a287e8ebeae3d)
*/
/**
/**
* Contribution Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* default financial type assigned to contributions submitted via this page, e.g. Contribution, Campaign Contribution
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* if true - processing logic must reject transaction at confirmation stage if pay method != credit card
*
- * @var boolean
+ * @var bool
*/
public $is_credit_card_only;
/**
* if true - allows real-time monetary transactions otherwise non-monetary transactions
*
- * @var boolean
+ * @var bool
*/
public $is_monetary;
/**
* if true - allows recurring contributions, valid only for PayPal_Standard
*
- * @var boolean
+ * @var bool
*/
public $is_recur;
/**
* if false, the confirm page in contribution pages gets skipped
*
- * @var boolean
+ * @var bool
*/
public $is_confirm_enabled;
/**
* if true - supports recurring intervals
*
- * @var boolean
+ * @var bool
*/
public $is_recur_interval;
/**
* if true - asks user for recurring installments
*
- * @var boolean
+ * @var bool
*/
public $is_recur_installments;
/**
* if true - user is able to adjust payment start date
*
- * @var boolean
+ * @var bool
*/
public $adjust_recur_start_date;
/**
* if true - allows the user to send payment directly to the org later
*
- * @var boolean
+ * @var bool
*/
public $is_pay_later;
/**
* is partial payment enabled for this online contribution page
*
- * @var boolean
+ * @var bool
*/
public $is_partial_payment;
/**
* if true, page will include an input text field where user can enter their own amount
*
- * @var boolean
+ * @var bool
*/
public $is_allow_other_amount;
/**
* FK to civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $default_amount_id;
/**
* if true, receipt is automatically emailed to contact on success
*
- * @var boolean
+ * @var bool
*/
public $is_email_receipt;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $amount_block_is_active;
/**
* FK to civicrm_contact, who created this contribution page
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* The campaign for which we are collecting contributions with this page.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* Can people share the contribution page through social media?
*
- * @var boolean
+ * @var bool
*/
public $is_share;
/**
* if true - billing block is required for online contribution page
*
- * @var boolean
+ * @var bool
*/
public $is_billing_required;
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'payment_processor' => [
'name' => 'payment_processor',
'table' => 'civicrm_payment_processor',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'is_credit_card_only' => [
'name' => 'is_credit_card_only',
'optionGroupName' => 'recur_frequency_units',
'keyColumn' => 'name',
'optionEditPath' => 'civicrm/admin/options/recur_frequency_units',
- ]
+ ],
],
'is_recur_interval' => [
'name' => 'is_recur_interval',
'description' => ts('Minimum initial amount for partial payment'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_contribution_page.min_initial_amount',
'table_name' => 'civicrm_contribution_page',
'description' => ts('if other amounts allowed, user can configure minimum allowed.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_contribution_page.min_amount',
'table_name' => 'civicrm_contribution_page',
'description' => ts('if other amounts allowed, user can configure maximum allowed.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_contribution_page.max_amount',
'table_name' => 'civicrm_contribution_page',
'description' => ts('The target goal for this page, allows people to build a goal meter'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_contribution_page.goal_amount',
'table_name' => 'civicrm_contribution_page',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'campaign_id' => [
'name' => 'campaign_id',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'is_share' => [
'name' => 'is_share',
*
* Generated from xml/schema/CRM/Contribute/ContributionProduct.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b5a1b3fa2819c4dfe99635fef8583a42)
+ * (GenCodeChecksum:565e6473df8dd62f25ba951b18860b5c)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
- * @var int unsigned
+ * @var int
*/
public $product_id;
/**
- * @var int unsigned
+ * @var int
*/
public $contribution_id;
/**
* FK to Financial Type(for membership price sets only).
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Contribute/ContributionRecur.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2ccc42487b9e4e5774fcfcde7db9c5ae)
+ * (GenCodeChecksum:02897f2c575bc43e915d0b7e8ee68fbb)
*/
/**
/**
* Contribution Recur ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to civicrm_contact.id.
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Number of time units for recurrence of payment.
*
- * @var int unsigned
+ * @var int
*/
public $frequency_interval;
/**
* Total number of payments to be made. Set this to 0 if this is an open-ended commitment i.e. no set end date.
*
- * @var int unsigned
+ * @var int
*/
public $installments;
/**
* Optionally used to store a link to a payment token used for this recurring contribution.
*
- * @var int unsigned
+ * @var int
*/
public $payment_token_id;
public $invoice_id;
/**
- * @var int unsigned
+ * @var int
*/
public $contribution_status_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
* Day in the period when the payment should be charged e.g. 1st of month, 15th etc.
*
- * @var int unsigned
+ * @var int
*/
public $cycle_day;
/**
* Number of failed charge attempts since last success. Business rule could be set to deactivate on more than x failures.
*
- * @var int unsigned
+ * @var int
*/
public $failure_count;
/**
* Some systems allow contributor to set a number of installments - but then auto-renew the subscription or commitment if they do not cancel.
*
- * @var boolean
+ * @var bool
*/
public $auto_renew;
/**
* Foreign key to civicrm_payment_processor.id
*
- * @var int unsigned
+ * @var int
*/
public $payment_processor_id;
/**
* FK to Financial Type
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* FK to Payment Instrument
*
- * @var int unsigned
+ * @var int
*/
public $payment_instrument_id;
/**
* The campaign for which this contribution has been triggered.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* if true, receipt is automatically emailed to contact on each successful payment
*
- * @var boolean
+ * @var bool
*/
public $is_email_receipt;
public static function &fields() {
if (!isset(Civi::$statics[__CLASS__]['fields'])) {
Civi::$statics[__CLASS__]['fields'] = [
- 'id' => [
+ 'contribution_recur_id' => [
'name' => 'id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Recurring Contribution ID'),
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_contribution_recur.amount',
'table_name' => 'civicrm_contribution_recur',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'frequency_unit' => [
'name' => 'frequency_unit',
'optionGroupName' => 'recur_frequency_units',
'keyColumn' => 'name',
'optionEditPath' => 'civicrm/admin/options/recur_frequency_units',
- ]
+ ],
],
'frequency_interval' => [
'name' => 'frequency_interval',
'formatType' => 'activityDate',
],
],
- 'processor_id' => [
+ 'contribution_recur_processor_id' => [
'name' => 'processor_id',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Processor ID'),
'localizable' => 0,
'FKClassName' => 'CRM_Financial_DAO_PaymentToken',
],
- 'trxn_id' => [
+ 'contribution_recur_trxn_id' => [
'name' => 'trxn_id',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Transaction ID'),
'type' => 'Text',
],
],
- 'contribution_status_id' => [
+ 'contribution_recur_contribution_status_id' => [
'name' => 'contribution_status_id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Status'),
'pseudoconstant' => [
'optionGroupName' => 'contribution_status',
'optionEditPath' => 'civicrm/admin/options/contribution_status',
- ]
+ ],
],
'is_test' => [
'name' => 'is_test',
'type' => 'CheckBox',
],
],
- 'payment_processor_id' => [
+ 'contribution_recur_payment_processor_id' => [
'name' => 'payment_processor_id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Payment Processor'),
'table' => 'civicrm_payment_processor',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'financial_type_id' => [
'name' => 'financial_type_id',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'payment_instrument_id' => [
'name' => 'payment_instrument_id',
'pseudoconstant' => [
'optionGroupName' => 'payment_instrument',
'optionEditPath' => 'civicrm/admin/options/payment_instrument',
- ]
+ ],
],
'contribution_campaign_id' => [
'name' => 'campaign_id',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'is_email_receipt' => [
'name' => 'is_email_receipt',
*
* Generated from xml/schema/CRM/Contribute/ContributionSoft.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b9a4bdee130cdaf934a53e456cd0e3e8)
+ * (GenCodeChecksum:12f49d75296e9500e850dd63741372ea)
*/
/**
/**
* Soft Contribution ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to contribution table.
*
- * @var int unsigned
+ * @var int
*/
public $contribution_id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to civicrm_pcp.id
*
- * @var int unsigned
+ * @var int
*/
public $pcp_id;
/**
- * @var boolean
+ * @var bool
*/
public $pcp_display_in_roll;
/**
* Soft Credit Type ID.Implicit FK to civicrm_option_value where option_group = soft_credit_type.
*
- * @var int unsigned
+ * @var int
*/
public $soft_credit_type_id;
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_contribution_soft.amount',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'pcp_id' => [
'name' => 'pcp_id',
'table' => 'civicrm_pcp',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'pcp_display_in_roll' => [
'name' => 'pcp_display_in_roll',
'pseudoconstant' => [
'optionGroupName' => 'soft_credit_type',
'optionEditPath' => 'civicrm/admin/options/soft_credit_type',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Contribute/Premium.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:09b04d3dd373d7dc64bc873b56b5e171)
+ * (GenCodeChecksum:5193d923732bb6b983b32e86e9441d72)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
public $entity_table;
/**
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* Is the Premiums feature enabled for this page?
*
- * @var boolean
+ * @var bool
*/
public $premiums_active;
/**
* Boolean. Should we automatically display minimum contribution amount text after the premium descriptions.
*
- * @var boolean
+ * @var bool
*/
public $premiums_display_min_contribution;
public $premiums_nothankyou_label;
/**
- * @var int unsigned
+ * @var int
*/
public $premiums_nothankyou_position;
*
* Generated from xml/schema/CRM/Contribute/PremiumsProduct.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b6944ad257ea16a60d6c1cf79ca391b0)
+ * (GenCodeChecksum:400970a4b33e5fc5af3784b5dbf9f90c)
*/
/**
/**
* Contribution ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to premiums settings record.
*
- * @var int unsigned
+ * @var int
*/
public $premiums_id;
/**
* Foreign key to each product object.
*
- * @var int unsigned
+ * @var int
*/
public $product_id;
/**
- * @var int unsigned
+ * @var int
*/
public $weight;
/**
* FK to Financial Type.
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Contribute/Product.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7db77c58d48112d25da791aba4586080)
+ * (GenCodeChecksum:27002591d220b4bc2498b367bef17367)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Financial Type.
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* Disabling premium removes it from the premiums_premium join table below.
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Rolling means we set start/end based on current day, fixed means we set start/end for current year or month
- (e.g. 1 year + fixed -> we would set start/end for 1/1/06 thru 12/31/06 for any premium chosen in 2006)
+ * (e.g. 1 year + fixed -> we would set start/end for 1/1/06 thru 12/31/06 for any premium chosen in 2006)
*
* @var string
*/
'description' => ts('Sell price or market value for premiums. For tax-deductible contributions, this will be stored as non_deductible_amount in the contribution record.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_product.price',
'table_name' => 'civicrm_product',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'financial_type_id' => [
'name' => 'financial_type_id',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'min_contribution' => [
'name' => 'min_contribution',
'description' => ts('Minimum contribution required to be eligible to select this premium.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_product.min_contribution',
'table_name' => 'civicrm_product',
'description' => ts('Actual cost of this product. Useful to determine net return from sale or using this as an incentive.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_product.cost',
'table_name' => 'civicrm_product',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::periodType',
- ]
+ ],
],
'fixed_period_start_day' => [
'name' => 'fixed_period_start_day',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getPremiumUnits',
- ]
+ ],
],
'duration_interval' => [
'name' => 'duration_interval',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getPremiumUnits',
- ]
+ ],
],
'frequency_interval' => [
'name' => 'frequency_interval',
*
* Generated from xml/schema/CRM/Contribute/Widget.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0605d26592e841a169687b225d891bc8)
+ * (GenCodeChecksum:c958a95fa7e2ff07a891780d343cd308)
*/
/**
/**
* Contribution Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* The Contribution Page which triggered this contribution
*
- * @var int unsigned
+ * @var int
*/
public $contribution_page_id;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
* Is this contribution associated with an online
* financial transaction
*
- * @var boolean
+ * @var bool
*/
public $_online = FALSE;
* Is this contribution associated with an online.
* financial transaction
*
- * @var boolean
+ * @var bool
*/
public $_online = FALSE;
public $_fromEmails;
/**
- * ID of from email
- * @var integer
+ * ID of from email.
+ *
+ * @var int
*/
public $fromEmailId;
public $userEmail;
/**
- * Price set ID
- * @var integer
+ * Price set ID.
+ *
+ * @var int
*/
public $_priceSetId;
}
// CRM-16189, add Revenue Recognition Date
- if (CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled')) {
+ if (Civi::settings()->get('deferred_revenue_enabled')) {
$revenueDate = $this->add('date', 'revenue_recognition_date', ts('Revenue Recognition Date'), CRM_Core_SelectValues::date(NULL, 'M Y', NULL, 5));
if ($this->_id && !CRM_Contribute_BAO_Contribution::allowUpdateRevenueRecognitionDate($this->_id)) {
$revenueDate->freeze();
/**
* Pcp id
*
- * @var integer
+ * @var int
*/
public $_pcpId;
/**
* Contribution page supports memberships
- * @var boolean
+ * @var bool
*/
public $_useForMember;
/**
* Are we in single form mode or wizard mode?
*
- * @var boolean
+ * @var bool
*/
protected $_single;
/**
* Is this the first page?
*
- * @var boolean
+ * @var bool
*/
protected $_first = FALSE;
/**
* Is this the last page?
*
- * @var boolean
+ * @var bool
*/
protected $_last = FALSE;
// @todo look to change to $defaults['start_date'] = date('Ymd His');
// main settings form overrides this to implement above but this is left here
// 'in case' another extending form uses start_date - for now
- list($defaults['start_date'], $defaults['start_date_time']) = CRM_Utils_Date::setDateDefaults();
+ $defaults['start_date'] = date('Y-m-d H:i:s');
}
if (!empty($defaults['recur_frequency_unit'])) {
$this->addElement('checkbox', 'adjust_recur_start_date', ts('Adjust Recurring Start Date'), NULL,
['onclick' => "showHideByValue('adjust_recur_start_date',true,'recurDefaults','table-row','radio',false);"]
);
- $this->addDate('pledge_calendar_date', ts('Specific Calendar Date'));
+ $this->add('datepicker', 'pledge_calendar_date', ts('Specific Calendar Date'), [], FALSE, ['time' => FALSE]);
$month = CRM_Utils_Date::getCalendarDayOfMonth();
$this->add('select', 'pledge_calendar_month', ts('Specific day of Month'), $month);
$pledgeDefaults = [
'calendar_month' => 'pledge_calendar_month',
];
if ($params['pledge_default_toggle'] == 'contribution_date') {
- $fieldValue = json_encode(['contribution_date' => date('m/d/Y')]);
+ $fieldValue = json_encode(['contribution_date' => date('Y-m-d')]);
}
else {
foreach ($pledgeDateFields as $key => $pledgeDateField) {
*/
class CRM_Contribute_Form_ContributionRecur extends CRM_Core_Form {
+ use CRM_Core_Form_EntityFormTrait;
+
/**
* @var int Contribution ID
*/
*/
public $_paymentProcessor = [];
+ /**
+ * Fields for the entity to be assigned to the template.
+ *
+ * Fields may have keys
+ * - name (required to show in tpl from the array)
+ * - description (optional, will appear below the field)
+ * - not-auto-addable - this class will not attempt to add the field using addField.
+ * (this will be automatically set if the field does not have html in it's metadata
+ * or is not a core field on the form's entity).
+ * - help (option) add help to the field - e.g ['id' => 'id-source', 'file' => 'CRM/Contact/Form/Contact']]
+ * - template - use a field specific template to render this field
+ * @var array
+ */
+ protected $entityFields = [];
+
/**
* Explicitly declare the entity api name.
*/
* Set variables up before form is built.
*/
public function preProcess() {
+ $this->setAction(CRM_Core_Action::UPDATE);
$this->_mid = CRM_Utils_Request::retrieve('mid', 'Integer', $this, FALSE);
$this->_crid = CRM_Utils_Request::retrieve('crid', 'Integer', $this, FALSE);
$this->contributionRecurID = $this->_crid;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
/**
* The flag to tell if there are soft credits included.
*
- * @var boolean
+ * @var bool
*/
public $_includesSoftCredits = FALSE;
* Are we operating in "single mode", i.e. deleting one
* specific contribution?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. updating the task of only
* one specific contribution?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. updating the task of only
* one specific contribution?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. updating the task of only
* one specific contribution?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
public $_type;
/**
- * Is this field required
- * @var boolean
+ * Is this field required.
+ *
+ * @var bool
*/
public $_required;
/**
* Whether the file has a column header or not
*
- * @var boolean
+ * @var bool
*/
protected $_haveColumnHeader;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
* Different possible actions are defined here. Keep in sync with the
* constant from CRM_Core_Form for various modes.
*
- * @var integer const
+ * @var int
*/
const
NONE = 0,
return $result;
}
+ /**
+ * Given a set of links and a mask, return a filtered (by mask) array containing the final links with parsed values
+ * and calling hooks as appropriate.
+ * Use this when passing a set of action links to the API or to the form without adding html formatting.
+ *
+ * @param array $links
+ * The set of link items.
+ * @param int $mask
+ * The mask to be used. a null mask means all items.
+ * @param array $values
+ * The array of values for parameter substitution in the link items.
+ * @param null $op
+ * @param null $objectName
+ * @param int $objectId
+ *
+ * @return array|null
+ * The array describing each link
+ */
+ public static function filterLinks(
+ $links,
+ $mask,
+ $values,
+ $op = NULL,
+ $objectName = NULL,
+ $objectId = NULL
+ ) {
+ if (empty($links)) {
+ return NULL;
+ }
+
+ // make links indexed sequentially instead of by bitmask
+ // otherwise it's next to impossible to reliably add new ones
+ $seqLinks = array();
+ foreach ($links as $bit => $link) {
+ $link['bit'] = $bit;
+ $seqLinks[] = $link;
+ }
+
+ if ($op && $objectName && $objectId) {
+ CRM_Utils_Hook::links($op, $objectName, $objectId, $seqLinks, $mask, $values);
+ }
+
+ foreach ($seqLinks as $i => $link) {
+ if (!$mask || !array_key_exists('bit', $link) || ($mask & $link['bit'])) {
+ $seqLinks[$i]['extra'] = isset($link['extra']) ? self::replace($link['extra'], $values) : NULL;
+
+ if (isset($link['qs']) && !CRM_Utils_System::isNull($link['qs'])) {
+ $seqLinks[$i]['url'] = self::replace($link['url'], $values);
+ $seqLinks[$i]['qs'] = self::replace($link['qs'], $values);
+ }
+ }
+ else {
+ unset($seqLinks[$i]);
+ }
+ }
+
+ return $seqLinks;
+ }
+
/**
* Given a string and an array of values, substitute the real values
* in the placeholder in the str in the CiviCRM format
return ["sms_phone_missing" => "Couldn't find recipient's phone number."];
}
+ // dev/core#369 If an SMS provider is deleted then the relevant row in the action_schedule_table is set to NULL
+ // So we need to exclude them.
+ if (CRM_Utils_System::isNull($schedule->sms_provider_id)) {
+ return ["sms_provider_missing" => "SMS reminder cannot be sent because the SMS provider has been deleted."];
+ }
+
$messageSubject = $tokenRow->render('subject');
$sms_body_text = $tokenRow->render('sms_body_text');
$addressDAO->copyValues($params);
$addressDAO->id = $dao->id;
$addressDAO->save();
- $addressDAO->free();
}
}
}
}
if (!empty($props['country_id'])) {
+ if (!CRM_Utils_Rule::commaSeparatedIntegers(implode(',', (array) $props['country_id']))) {
+ throw new CRM_Core_Exception(ts('Province limit or default country setting is incorrect'));
+ }
$params['condition'] = 'country_id IN (' . implode(',', (array) $props['country_id']) . ')';
}
break;
if ($context != 'get' && $context != 'validate') {
$config = CRM_Core_Config::singleton();
if (!empty($config->countryLimit) && is_array($config->countryLimit)) {
+ if (!CRM_Utils_Rule::commaSeparatedIntegers(implode(',', $config->countryLimit))) {
+ throw new CRM_Core_Exception(ts('Available Country setting is incorrect'));
+ }
$params['condition'] = 'id IN (' . implode(',', $config->countryLimit) . ')';
}
}
// Filter county list based on chosen state
case 'county_id':
if (!empty($props['state_province_id'])) {
+ if (!CRM_Utils_Rule::commaSeparatedIntegers(implode(',', (array) $props['state_province_id']))) {
+ throw new CRM_Core_Exception(ts('Can only accept Integers for state_province_id filtering'));
+ }
$params['condition'] = 'state_province_id IN (' . implode(',', (array) $props['state_province_id']) . ')';
}
break;
$block->is_primary = FALSE;
$block->save();
}
- $block->free();
}
}
}
if (!empty($customDataSubType)) {
$subtypeClause = array();
foreach ($customDataSubType as $subtype) {
- $subtype = CRM_Core_DAO::VALUE_SEPARATOR . $subtype . CRM_Core_DAO::VALUE_SEPARATOR;
+ $subtype = CRM_Core_DAO::VALUE_SEPARATOR . CRM_Utils_Type::escape($subtype, 'String') . CRM_Core_DAO::VALUE_SEPARATOR;
$subtypeClause[] = "$cgTable.extends_entity_column_value LIKE '%{$subtype}%'";
}
if (!$onlySubType) {
}
break;
- case 'Autocomplete-Select':
- if ($customField->data_type == 'ContactReference') {
- if (is_numeric($value)) {
- $defaults[$elementName . '_id'] = $value;
- $defaults[$elementName] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $value, 'sort_name');
- }
- }
- else {
- $defaults[$elementName] = $value;
- }
- break;
-
default:
$defaults[$elementName] = $value;
}
if (!$dao->fetch()) {
CRM_Core_Error::fatal();
}
- $dao->free();
$fieldValues = array($dao->table_name, $dao->column_name, $dao->id);
$cache->set($cacheKey, $fieldValues);
}
$params = [];
$sqlParamKey = 1;
+ $subType = '';
if (!empty($subTypes)) {
foreach ($subTypes as $key => $subType) {
$subTypeClauses[] = self::whereListHas("civicrm_custom_group.extends_entity_column_value", self::validateSubTypeByEntity($entityType, $subType));
}
if (empty($groupTree)) {
- $groupTree = $multipleFieldGroups = [];
- $crmDAO = CRM_Core_DAO::executeQuery($queryString, $params);
- $customValueTables = [];
-
- // process records
- while ($crmDAO->fetch()) {
- // get the id's
- $groupID = $crmDAO->civicrm_custom_group_id;
- $fieldId = $crmDAO->civicrm_custom_field_id;
- if ($crmDAO->civicrm_custom_group_is_multiple) {
- $multipleFieldGroups[$groupID] = $crmDAO->civicrm_custom_group_table_name;
- }
- // create an array for groups if it does not exist
- if (!array_key_exists($groupID, $groupTree)) {
- $groupTree[$groupID] = [];
- $groupTree[$groupID]['id'] = $groupID;
-
- // populate the group information
- foreach ($toReturn['custom_group'] as $fieldName) {
- $fullFieldName = "civicrm_custom_group_$fieldName";
- if ($fieldName == 'id' ||
- is_null($crmDAO->$fullFieldName)
- ) {
- continue;
- }
- // CRM-5507
- // This is an old bit of code - per the CRM number & probably does not work reliably if
- // that one contact sub-type exists.
- if ($fieldName == 'extends_entity_column_value' && !empty($subTypes[0])) {
- $groupTree[$groupID]['subtype'] = self::validateSubTypeByEntity($entityType, $subType);
- }
- $groupTree[$groupID][$fieldName] = $crmDAO->$fullFieldName;
- }
- $groupTree[$groupID]['fields'] = [];
-
- $customValueTables[$crmDAO->civicrm_custom_group_table_name] = [];
- }
-
- // add the fields now (note - the query row will always contain a field)
- // we only reset this once, since multiple values come is as multiple rows
- if (!array_key_exists($fieldId, $groupTree[$groupID]['fields'])) {
- $groupTree[$groupID]['fields'][$fieldId] = [];
- }
-
- $customValueTables[$crmDAO->civicrm_custom_group_table_name][$crmDAO->civicrm_custom_field_column_name] = 1;
- $groupTree[$groupID]['fields'][$fieldId]['id'] = $fieldId;
- // populate information for a custom field
- foreach ($toReturn['custom_field'] as $fieldName) {
- $fullFieldName = "civicrm_custom_field_$fieldName";
- if ($fieldName == 'id' ||
- is_null($crmDAO->$fullFieldName)
- ) {
- continue;
- }
- $groupTree[$groupID]['fields'][$fieldId][$fieldName] = $crmDAO->$fullFieldName;
- }
- }
-
- if (!empty($customValueTables)) {
- $groupTree['info'] = ['tables' => $customValueTables];
- }
+ list($multipleFieldGroups, $groupTree) = self::buildGroupTree($entityType, $toReturn, $subTypes, $queryString, $params, $subType);
$cache->set($cacheKey, $groupTree);
$cache->set($multipleFieldGroupCacheKey, $multipleFieldGroups);
return $multipleGroup;
}
+ /**
+ * Build the metadata tree for the custom group.
+ *
+ * @param string $entityType
+ * @param array $toReturn
+ * @param array $subTypes
+ * @param string $queryString
+ * @param array $params
+ * @param string $subType
+ *
+ * @return array
+ * @throws \CRM_Core_Exception
+ */
+ private static function buildGroupTree($entityType, $toReturn, $subTypes, $queryString, $params, $subType) {
+ $groupTree = $multipleFieldGroups = [];
+ $crmDAO = CRM_Core_DAO::executeQuery($queryString, $params);
+ $customValueTables = [];
+
+ // process records
+ while ($crmDAO->fetch()) {
+ // get the id's
+ $groupID = $crmDAO->civicrm_custom_group_id;
+ $fieldId = $crmDAO->civicrm_custom_field_id;
+ if ($crmDAO->civicrm_custom_group_is_multiple) {
+ $multipleFieldGroups[$groupID] = $crmDAO->civicrm_custom_group_table_name;
+ }
+ // create an array for groups if it does not exist
+ if (!array_key_exists($groupID, $groupTree)) {
+ $groupTree[$groupID] = [];
+ $groupTree[$groupID]['id'] = $groupID;
+
+ // populate the group information
+ foreach ($toReturn['custom_group'] as $fieldName) {
+ $fullFieldName = "civicrm_custom_group_$fieldName";
+ if ($fieldName == 'id' ||
+ is_null($crmDAO->$fullFieldName)
+ ) {
+ continue;
+ }
+ // CRM-5507
+ // This is an old bit of code - per the CRM number & probably does not work reliably if
+ // that one contact sub-type exists.
+ if ($fieldName == 'extends_entity_column_value' && !empty($subTypes[0])) {
+ $groupTree[$groupID]['subtype'] = self::validateSubTypeByEntity($entityType, $subType);
+ }
+ $groupTree[$groupID][$fieldName] = $crmDAO->$fullFieldName;
+ }
+ $groupTree[$groupID]['fields'] = [];
+
+ $customValueTables[$crmDAO->civicrm_custom_group_table_name] = [];
+ }
+
+ // add the fields now (note - the query row will always contain a field)
+ // we only reset this once, since multiple values come is as multiple rows
+ if (!array_key_exists($fieldId, $groupTree[$groupID]['fields'])) {
+ $groupTree[$groupID]['fields'][$fieldId] = [];
+ }
+
+ $customValueTables[$crmDAO->civicrm_custom_group_table_name][$crmDAO->civicrm_custom_field_column_name] = 1;
+ $groupTree[$groupID]['fields'][$fieldId]['id'] = $fieldId;
+ // populate information for a custom field
+ foreach ($toReturn['custom_field'] as $fieldName) {
+ $fullFieldName = "civicrm_custom_field_$fieldName";
+ if ($fieldName == 'id' ||
+ is_null($crmDAO->$fullFieldName)
+ ) {
+ continue;
+ }
+ $groupTree[$groupID]['fields'][$fieldId][$fieldName] = $crmDAO->$fullFieldName;
+ }
+ }
+
+ if (!empty($customValueTables)) {
+ $groupTree['info'] = ['tables' => $customValueTables];
+ }
+ return [$multipleFieldGroups, $groupTree];
+ }
+
}
];
}
$sql = "UPDATE `{$customGroup->table_name}` SET `{$customField->column_name}` = REPLACE(`{$customField->column_name}`, %1, %2) WHERE `{$customField->column_name}` LIKE %3";
- $customGroup->free();
CRM_Core_DAO::executeQuery($sql, $params);
}
- $customField->free();
}
}
/**
* Searching for contacts?
*
- * @var boolean
+ * @var bool
*/
protected $_contactSearch;
foreach ($value as $key => $val) {
$value[$key] = str_replace(['[', ']', ','], ['\[', '\]', '[:comma:]'], $val);
$value[$key] = str_replace('|', '[:separator:]', $value[$key]);
+ if ($field['data_type'] == 'String') {
+ $value[$key] = CRM_Utils_Type::escape($value[$key], 'String');
+ }
+ elseif ($value) {
+ $value[$key] = CRM_Utils_Type::escape($value[$key], 'Integer');
+ }
}
$value = implode(',', $value);
}
$entityFileDAO->entity_id = $field['entity_id'];
$entityFileDAO->file_id = $field['file_id'];
$entityFileDAO->save();
- $entityFileDAO->free();
$value = $field['file_id'];
$type = 'String';
break;
* @return array
*/
public static function setValues(&$params) {
+ // For legacy reasons, accept this param in either format
+ if (empty($params['entityID']) && !empty($params['entity_id'])) {
+ $params['entityID'] = $params['entity_id'];
+ }
- if (!isset($params['entityID']) ||
- CRM_Utils_Type::escape($params['entityID'], 'Integer', FALSE) === NULL
- ) {
- return CRM_Core_Error::createAPIError(ts('entityID needs to be set and of type Integer'));
+ if (!isset($params['entityID']) || !CRM_Utils_Type::validate($params['entityID'], 'Integer', FALSE)) {
+ return CRM_Core_Error::createAPIError(ts('entity_id needs to be set and of type Integer'));
}
// first collect all the id/value pairs. The format is:
// custom_X => value or custom_X_VALUEID => value (for multiple values), VALUEID == -1, -2 etc for new insertions
- $values = [];
$fieldValues = [];
foreach ($params as $n => $v) {
if ($customFieldInfo = CRM_Core_BAO_CustomField::getKeyID($n, TRUE)) {
$fileDAO = new CRM_Core_DAO_File();
$fileDAO->id = $fileID;
if (!$fileDAO->find(TRUE)) {
- CRM_Core_Error::fatal();
+ throw new CRM_Core_Exception(ts('File not found'));
}
// lets call a pre hook before the delete, so attachments hooks can get the info before things
$entityFileDAO->entity_table = $tableName;
if (!$entityFileDAO->find(TRUE)) {
- CRM_Core_Error::fatal(sprintf('No record found for given file ID - %d and entity ID - %d', $fileID, $entityID));
+ throw new CRM_Core_Exception(sprintf('No record found for given file ID - %d and entity ID - %d', $fileID, $entityID));
}
$entityFileDAO->delete();
],
'replace' => $params,
];
- $copy = &CRM_Core_DAO::copyGeneric('CRM_Core_DAO_Job', ['id' => $id], NULL, $fieldsFix);
+ $copy = CRM_Core_DAO::copyGeneric('CRM_Core_DAO_Job', ['id' => $id], NULL, $fieldsFix);
$copy->save();
CRM_Utils_Hook::copy('Job', $copy);
$dao->id = $id;
$dao->find(TRUE);
$dao->delete();
- $dao->free();
}
}
}
* newly created/updated location block id.
*/
public static function copyLocBlock($locBlockId, $updateLocBlockId = NULL) {
+ CRM_Core_Error::deprecatedFunctionWarning('unused function which will be removed');
//get the location info.
$defaults = $updateValues = [];
$locBlock = ['id' => $locBlockId];
}
}
- $copyLocation = &CRM_Core_DAO::copyGeneric('CRM_Core_DAO_LocBlock',
+ $copyLocation = CRM_Core_DAO::copyGeneric('CRM_Core_DAO_LocBlock',
['id' => $locBlock['id']],
$copyLocationParams
);
$childNote = new CRM_Core_DAO_Note();
$childNote->id = $childId;
$childNote->delete();
- $childNote->free();
$recent[] = $childId;
}
$return = $note->delete();
- $note->free();
if ($showStatus) {
CRM_Core_Session::setStatus($status, ts('Deleted'), 'success');
}
$optionValue->weight = $opWeight;
$optionValue->save();
}
- $optionValue->free();
}
}
}
/**
- * Delete from the previous next cache table for a pair of ids.
+ * Delete pair from the previous next cache table to remove it from further merge consideration.
+ *
+ * The pair may have been flipped, so make sure we delete using both orders
*
* @param int $id1
* @param int $id2
* @param string $cacheKey
- * @param bool $isViceVersa
- * @param string $entityTable
*/
- public static function deletePair($id1, $id2, $cacheKey = NULL, $isViceVersa = FALSE, $entityTable = 'civicrm_contact') {
- $sql = "DELETE FROM civicrm_prevnext_cache WHERE entity_table = %1";
- $params = [1 => [$entityTable, 'String']];
+ public static function deletePair($id1, $id2, $cacheKey = NULL) {
+ $sql = "DELETE FROM civicrm_prevnext_cache WHERE entity_table = 'civicrm_contact'";
- $pair = !$isViceVersa ? "entity_id1 = %2 AND entity_id2 = %3" : "(entity_id1 = %2 AND entity_id2 = %3) OR (entity_id1 = %3 AND entity_id2 = %2)";
+ $pair = "(entity_id1 = %2 AND entity_id2 = %3) OR (entity_id1 = %3 AND entity_id2 = %2)";
$sql .= " AND ( {$pair} )";
$params[2] = [$id1, 'Integer'];
$params[3] = [$id2, 'Integer'];
$tags[$tag->id]['color'] = !empty($tag->color) ? $tag->color : NULL;
}
}
- $tag->free();
}
return $tags;
}
}
- $dao->free();
// While we have nodes left to build, shift the first (alphabetically)
// node of the list, place it in our tags list and loop through the
// list of unplaced nodes to find its children. We make a copy to
while ($dao->fetch()) {
$tagSets[$dao->id] = $dao->name;
}
- $dao->free();
return $tagSets;
}
* @return \CRM_Core_BAO_UFField
* @throws \API_Exception
*/
- public static function create(&$params) {
- // CRM-14756: kind of a hack-ish fix. If the user gives the id, uf_group_id is retrieved and then set.
- if (isset($params['id'])) {
- $groupId = civicrm_api3('UFField', 'getvalue', [
- 'return' => 'uf_group_id',
- 'id' => $params['id'],
- ]);
- }
- else {
- $groupId = CRM_Utils_Array::value('uf_group_id', $params);
- }
+ public static function create($params) {
+ $id = CRM_Utils_Array::value('id', $params);
- $field_name = CRM_Utils_Array::value('field_name', $params);
+ // Merge in data from existing field
+ if (!empty($id)) {
+ $UFField = new CRM_Core_BAO_UFField();
+ $UFField->id = $params['id'];
+ if ($UFField->find(TRUE)) {
+ $defaults = $UFField->toArray();
+ // This will be calculated based on field name
+ unset($defaults['field_type']);
+ $params += $defaults;
+ }
+ else {
+ throw new API_Exception("UFFIeld id {$params['id']} not found.");
+ }
+ }
- if (strpos($field_name, 'formatting') !== 0 && !CRM_Core_BAO_UFField::isValidFieldName($field_name)) {
+ // Validate field_name
+ if (strpos($params['field_name'], 'formatting') !== 0 && !CRM_Core_BAO_UFField::isValidFieldName($params['field_name'])) {
throw new API_Exception('The field_name is not valid');
}
- if (!(CRM_Utils_Array::value('group_id', $params))) {
- $params['group_id'] = $groupId;
+ // Supply default label if not set
+ if (empty($id) && !isset($params['label'])) {
+ $params['label'] = self::getAvailableFieldTitles()[$params['field_name']];
}
- $fieldId = CRM_Utils_Array::value('id', $params);
- if (!empty($fieldId)) {
- $UFField = new CRM_Core_BAO_UFField();
- $UFField->id = $fieldId;
- if ($UFField->find(TRUE)) {
- if (!(CRM_Utils_Array::value('group_id', $params))) {
- // this copied here from previous api function - not sure if required
- $params['group_id'] = $UFField->uf_group_id;
- }
- }
- else {
- throw new API_Exception("there is no field for this fieldId");
- }
+ // Supply field_type if not set
+ if (empty($params['field_type']) && strpos($params['field_name'], 'formatting') !== 0) {
+ $params['field_type'] = CRM_Utils_Array::pathGet(self::getAvailableFieldsFlat(), [$params['field_name'], 'field_type']);
+ }
+ elseif (empty($params['field_type'])) {
+ $params['field_type'] = 'Formatting';
+ }
+
+ // Generate unique name for formatting fields
+ if ($params['field_name'] === 'formatting') {
+ $params['field_name'] = 'formatting_' . substr(uniqid(), -4);
}
- $params['uf_group_id'] = $params['group_id'];
- if (CRM_Core_BAO_UFField::duplicateField($params)) {
+ if (self::duplicateField($params)) {
throw new API_Exception("The field was not added. It already exists in this profile.");
}
- // @todo fix BAO to be less weird.
- $field_type = CRM_Utils_Array::value('field_type', $params);
- $location_type_id = CRM_Utils_Array::value('location_type_id', $params, CRM_Utils_Array::value('website_type_id', $params));
- $phone_type = CRM_Utils_Array::value('phone_type_id', $params, CRM_Utils_Array::value('phone_type', $params));
- $params['field_name'] = [$field_type, $field_name, $location_type_id, $phone_type];
//@todo why is this even optional? Surely weight should just be 'managed' ??
if (CRM_Utils_Array::value('option.autoweight', $params, TRUE)) {
$params['weight'] = CRM_Core_BAO_UFField::autoWeight($params);
}
- // set values for uf field properties and save
+
+ // Set values for uf field properties and save
$ufField = new CRM_Core_DAO_UFField();
$ufField->copyValues($params);
- $ufField->field_type = $params['field_name'][0];
- $ufField->field_name = $params['field_name'][1];
- //should not set location type id for Primary
- $locationTypeId = NULL;
- if ($params['field_name'][1] == 'url') {
- $ufField->website_type_id = CRM_Utils_Array::value(2, $params['field_name']);
+ if ($params['field_name'] == 'url') {
+ $ufField->location_type_id = 'null';
}
else {
- $locationTypeId = CRM_Utils_Array::value(2, $params['field_name']);
- $ufField->website_type_id = NULL;
- }
- if ($locationTypeId) {
- $ufField->location_type_id = $locationTypeId;
+ $ufField->website_type_id = 'null';
}
- else {
- $ufField->location_type_id = 'null';
+ if (!strstr($params['field_name'], 'phone')) {
+ $ufField->phone_type_id = 'null';
}
- $ufField->phone_type_id = CRM_Utils_Array::value(3, $params['field_name'], 'NULL');
-
$ufField->save();
- $fieldsType = CRM_Core_BAO_UFGroup::calculateGroupType($groupId, TRUE);
- CRM_Core_BAO_UFGroup::updateGroupTypes($groupId, $fieldsType);
+ $fieldsType = CRM_Core_BAO_UFGroup::calculateGroupType($ufField->uf_group_id, TRUE);
+ CRM_Core_BAO_UFGroup::updateGroupTypes($ufField->uf_group_id, $fieldsType);
civicrm_api3('profile', 'getfields', ['cache_clear' => TRUE]);
return $ufField;
public static function duplicateField($params) {
$ufField = new CRM_Core_DAO_UFField();
$ufField->uf_group_id = CRM_Utils_Array::value('uf_group_id', $params);
- $ufField->field_type = $params['field_type'];
- $ufField->field_name = $params['field_name'];
+ $ufField->field_type = CRM_Utils_Array::value('field_type', $params);
+ $ufField->field_name = CRM_Utils_Array::value('field_name', $params);
$ufField->website_type_id = CRM_Utils_Array::value('website_type_id', $params);
if (is_null(CRM_Utils_Array::value('location_type_id', $params, ''))) {
// primary location type have NULL value in DB
$ufField->whereAdd("id <> " . $params['id']);
}
- return ($ufField->find(TRUE) ? 1 : 0);
+ return (bool) $ufField->find(TRUE);
}
/**
// fix for CRM-316
$oldWeight = NULL;
- if (!empty($params['field_id'])) {
- $oldWeight = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_UFField', $params['field_id'], 'weight', 'id');
+ if (!empty($params['field_id']) || !empty($params['id'])) {
+ $oldWeight = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_UFField', !empty($params['id']) ? $params['id'] : $params['field_id'], 'weight', 'id');
}
- $fieldValues = ['uf_group_id' => $params['group_id']];
+ $fieldValues = ['uf_group_id' => !empty($params['uf_group_id']) ? $params['uf_group_id'] : $params['group_id']];
return CRM_Utils_Weight::updateOtherWeights('CRM_Core_DAO_UFField', $oldWeight, CRM_Utils_Array::value('weight', $params, 0), $fieldValues);
}
*/
public static function getAvailableFieldTitles() {
$fields = self::getAvailableFieldsFlat();
+ $fields['formatting'] = ['title' => ts('Formatting')];
return CRM_Utils_Array::collect('title', $fields);
}
),
);
- $copy = &CRM_Core_DAO::copyGeneric('CRM_Core_DAO_UFGroup',
+ $copy = CRM_Core_DAO::copyGeneric('CRM_Core_DAO_UFGroup',
array('id' => $id),
NULL,
$fieldsFix
$copy->name = CRM_Utils_String::munge($copy->name, '_', 56) . "_{$copy->id}";
$copy->save();
- $copyUFJoin = &CRM_Core_DAO::copyGeneric('CRM_Core_DAO_UFJoin',
+ $copyUFJoin = CRM_Core_DAO::copyGeneric('CRM_Core_DAO_UFJoin',
array('uf_group_id' => $id),
array('uf_group_id' => $copy->id),
NULL,
'entity_table'
);
- $copyUFField = &CRM_Core_DAO::copyGeneric('CRM_Core_BAO_UFField',
+ $copyUFField = CRM_Core_DAO::copyGeneric('CRM_Core_BAO_UFField',
array('uf_group_id' => $id),
array('uf_group_id' => $copy->id)
);
// we do this to prevent a autoloader errors with joomla / 3rd party packages
// Use absolute path, since we don't know the content of include_path yet.
// CRM-11304
- $file = dirname(__FILE__) . '/../../vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php';
+ $file = dirname(__FILE__) . '/../../packages/IDS/vendors/htmlpurifer/HTMLPurifier/Bootstrap.php';
if (file_exists($file)) {
return $file;
}
public $database;
/**
- * @var string|NULL path in which to store a marker that indicates the last execution of
- * GenCode. If a matching marker already exists, GenCode doesn't run.
+ * Path in which to store a marker that indicates the last execution of GenCode.
+ *
+ * If a matching marker already exists, GenCode doesn't run.
+ *
+ * @var string|null
*/
public $digestPath;
/**
- * @var string|NULL a digest of the inputs to the code-generator (eg the properties and source files)
+ * Digest of the inputs to the code-generator (eg the properties and source files).
+ *
+ * @var string|null
*/
public $sourceDigest;
// need this case since some versions of mysql do not have boolean as a valid column type and hence it
// is changed to tinyint. hopefully after 2 yrs this case can be removed.
$field['sqlType'] = 'tinyint';
- $field['phpType'] = $type;
+ $field['phpType'] = 'bool';
$field['crmType'] = 'CRM_Utils_Type::T_' . strtoupper($type);
break;
$field['sqlType'] = 'decimal(' . $length . ')';
$field['phpType'] = 'float';
$field['crmType'] = 'CRM_Utils_Type::T_MONEY';
- $field['precision'] = $length;
+ $field['precision'] = $length . ',';
break;
case 'float':
$field['phpType'] = $this->value('phpType', $fieldXML, $type);
$field['sqlType'] = $type;
if ($type == 'int unsigned') {
+ $field['phpType'] = 'int';
$field['crmType'] = 'CRM_Utils_Type::T_INT';
}
else {
$field['uniqueName'] = $this->value('uniqueName', $fieldXML);
$field['serialize'] = $this->value('serialize', $fieldXML);
$field['html'] = $this->value('html', $fieldXML);
+ $field['protected'] = $this->value('protected', $fieldXML);
if (!empty($field['html'])) {
$validOptions = [
'type',
*
* @package CRM
* @copyright CiviCRM LLC (c) 2004-2019
- * $Id$
- *
*/
abstract class CRM_Core_Component_Info {
const COMPONENT_MENU_XML = 'Menu';
/**
- * Stores component information.
- * @var array component settings as key/value pairs
+ * Component settings as key/value pairs.
+ *
+ * @var array
*/
public $info;
/**
- * Stores component keyword.
- * @var string name of component keyword
+ * Component keyword.
+ *
+ * @var string
*/
protected $keyword;
* so the display routine needs to not do any work. (The
* parent object takes care of the display)
*
- * @var boolean
+ * @var bool
*/
protected $_embedded = FALSE;
* Useful when we run form in non civicrm context
* and we need to transfer control back.(eg. drupal)
*
- * @var boolean
+ * @var bool
*/
protected $_skipRedirection = FALSE;
* Are we in print mode? if so we need to modify the display
* functionality to do a minimal display :)
*
- * @var boolean
+ * @var bool
*/
public $_print = 0;
/**
* Should we generate a qfKey, true by default
*
- * @var boolean
+ * @var bool
*/
public $_generateQFKey = TRUE;
if (!array_key_exists($tableName, $show)) {
$query = "SHOW CREATE TABLE $tableName";
- $dao = CRM_Core_DAO::executeQuery($query);
+ $dao = CRM_Core_DAO::executeQuery($query, [], TRUE, NULL, FALSE, FALSE);
if (!$dao->fetch()) {
CRM_Core_Error::fatal();
foreach ($tables as $tableName) {
if (!array_key_exists($tableName, $show)) {
$query = "SHOW CREATE TABLE $tableName";
- $dao = CRM_Core_DAO::executeQuery($query);
+ $dao = CRM_Core_DAO::executeQuery($query, [], TRUE, NULL, FALSE, FALSE);
if (!$dao->fetch()) {
CRM_Core_Error::fatal();
* Fields that you want to block from.
* getting copied
*
- * @return CRM_Core_DAO
- * the newly created copy of the object
+ * @return CRM_Core_DAO|bool
+ * the newly created copy of the object. False if none created.
*/
- public static function ©Generic($daoName, $criteria, $newData = NULL, $fieldsFix = NULL, $blockCopyOfDependencies = NULL) {
+ public static function copyGeneric($daoName, $criteria, $newData = NULL, $fieldsFix = NULL, $blockCopyOfDependencies = NULL) {
$object = new $daoName();
+ $newObject = FALSE;
if (!$newData) {
$object->id = $criteria['id'];
}
}
}
$newObject->save();
- if (!empty($newData['custom'])) {
- CRM_Core_BAO_CustomValueTable::store($newData['custom'], $newObject::getTableName(), $newObject->id);
- }
+ $newObject->copyCustomFields($object->id, $newObject->id);
CRM_Utils_Hook::post('create', CRM_Core_DAO_AllCoreTables::getBriefName($daoName), $newObject->id, $newObject);
}
return $newObject;
}
+ /**
+ * Method that copies custom fields values from an old entity to a new one.
+ *
+ * Fixes bug CRM-19302,
+ * where if a custom field of File type was present, left both events using the same file,
+ * breaking download URL's for the old event.
+ *
+ * @todo the goal here is to clean this up so that it works for any entity. Copy Generic already DOES some custom field stuff
+ * but it seems to be bypassed & perhaps less good than this (or this just duplicates it...)
+ *
+ * @param int $entityID
+ * @param int $newEntityID
+ */
+ public function copyCustomFields($entityID, $newEntityID) {
+ $entity = CRM_Core_DAO_AllCoreTables::getBriefName(get_class($this));
+ $tableName = CRM_Core_DAO_AllCoreTables::getTableForClass(get_class($this));
+ // Obtain custom values for old event
+ $customParams = $htmlType = [];
+ $customValues = CRM_Core_BAO_CustomValueTable::getEntityValues($entityID, $entity);
+
+ // If custom values present, we copy them
+ if (!empty($customValues)) {
+ // Get Field ID's and identify File type attributes, to handle file copying.
+ $fieldIds = implode(', ', array_keys($customValues));
+ $sql = "SELECT id FROM civicrm_custom_field WHERE html_type = 'File' AND id IN ( {$fieldIds} )";
+ $result = CRM_Core_DAO::executeQuery($sql);
+
+ // Build array of File type fields
+ while ($result->fetch()) {
+ $htmlType[] = $result->id;
+ }
+
+ // Build params array of custom values
+ foreach ($customValues as $field => $value) {
+ if ($value !== NULL) {
+ // Handle File type attributes
+ if (in_array($field, $htmlType)) {
+ $fileValues = CRM_Core_BAO_File::path($value, $entityID);
+ $customParams["custom_{$field}_-1"] = [
+ 'name' => CRM_Utils_File::duplicate($fileValues[0]),
+ 'type' => $fileValues[1],
+ ];
+ }
+ // Handle other types
+ else {
+ $customParams["custom_{$field}_-1"] = $value;
+ }
+ }
+ }
+
+ // Save Custom Fields for new Event
+ CRM_Core_BAO_CustomValueTable::postProcess($customParams, $tableName, $newEntityID, $entity);
+ }
+
+ // copy activity attachments ( if any )
+ CRM_Core_BAO_File::copyEntityFile($tableName, $entityID, $tableName, $newEntityID);
+ }
+
/**
* Cascade update through related entities.
*
*
* Generated from xml/schema/CRM/Core/ActionLog.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:38f897676ff054f67ba7188470e41dee)
+ * (GenCodeChecksum:2ccacada384ba37fcf929647dfa3d845)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to id of the entity that the action was performed on. Pseudo - FK.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to the action schedule that this action originated from.
*
- * @var int unsigned
+ * @var int
*/
public $action_schedule_id;
/**
* Was there any error sending the reminder?
*
- * @var boolean
+ * @var bool
*/
public $is_error;
/**
* Keeps track of the sequence number of this repetition.
*
- * @var int unsigned
+ * @var int
*/
public $repetition_number;
*
* Generated from xml/schema/CRM/Core/ActionMapping.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:eafaaa48176b2854e6b8a7f19fc1ebe6)
+ * (GenCodeChecksum:c7d2ed31b30490f0a1794fb81b700ac6)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
*
* Generated from xml/schema/CRM/Core/ActionSchedule.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4d6dca3786a9d3ab90b492be017b045b)
+ * (GenCodeChecksum:cb2618343c279fbf0baabe1f1ebd9973)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this the recipient criteria limited to OR in addition to?
*
- * @var boolean
+ * @var bool
*/
public $limit_to;
/**
* Reminder Interval.
*
- * @var int unsigned
+ * @var int
*/
public $start_action_offset;
public $start_action_date;
/**
- * @var boolean
+ * @var bool
*/
public $is_repeat;
/**
* Time interval for repeating the reminder.
*
- * @var int unsigned
+ * @var int
*/
public $repetition_frequency_interval;
/**
* Time interval till repeating the reminder.
*
- * @var int unsigned
+ * @var int
*/
public $end_frequency_interval;
/**
* Is this option active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Record Activity for this reminder?
*
- * @var boolean
+ * @var bool
*/
public $record_activity;
/**
* FK to Group
*
- * @var int unsigned
+ * @var int
*/
public $group_id;
/**
* FK to the message template.
*
- * @var int unsigned
+ * @var int
*/
public $msg_template_id;
/**
* FK to the message template.
*
- * @var int unsigned
+ * @var int
*/
public $sms_template_id;
public $mode;
/**
- * @var int unsigned
+ * @var int
*/
public $sms_provider_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getRecurringFrequencyUnits',
- ]
+ ],
],
'start_action_condition' => [
'name' => 'start_action_condition',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getRecurringFrequencyUnits',
- ]
+ ],
],
'repetition_frequency_interval' => [
'name' => 'repetition_frequency_interval',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getRecurringFrequencyUnits',
- ]
+ ],
],
'end_frequency_interval' => [
'name' => 'end_frequency_interval',
'table' => 'civicrm_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'msg_template_id' => [
'name' => 'msg_template_id',
'pseudoconstant' => [
'optionGroupName' => 'msg_mode',
'optionEditPath' => 'civicrm/admin/options/msg_mode',
- ]
+ ],
],
'sms_provider_id' => [
'name' => 'sms_provider_id',
*
* Generated from xml/schema/CRM/Core/Address.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a81d4789f6650c68145ab9bf1e4481a8)
+ * (GenCodeChecksum:4999e79688aae8d0958e46cbd320ae3a)
*/
/**
/**
* Unique Address ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Which Location does this address belong to.
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
/**
* Is this the primary address.
*
- * @var boolean
+ * @var bool
*/
public $is_primary;
/**
* Is this the billing address.
*
- * @var boolean
+ * @var bool
*/
public $is_billing;
/**
* Concatenation of all routable street address components (prefix, street number, street name, suffix, unit
- number OR P.O. Box). Apps should be able to determine physical location with this data (for mapping, mail
- delivery, etc.).
+ * number OR P.O. Box). Apps should be able to determine physical location with this data (for mapping, mail
+ * delivery, etc.).
*
* @var string
*/
/**
* Which County does this address belong to.
*
- * @var int unsigned
+ * @var int
*/
public $county_id;
/**
* Which State_Province does this address belong to.
*
- * @var int unsigned
+ * @var int
*/
public $state_province_id;
/**
* Which Country does this address belong to.
*
- * @var int unsigned
+ * @var int
*/
public $country_id;
/**
* Is this a manually entered geo code
*
- * @var boolean
+ * @var bool
*/
public $manual_geo_code;
/**
* FK to Address ID
*
- * @var int unsigned
+ * @var int
*/
public $master_id;
'table' => 'civicrm_location_type',
'keyColumn' => 'id',
'labelColumn' => 'display_name',
- ]
+ ],
],
'is_primary' => [
'name' => 'is_primary',
'title' => ts('Street Address'),
'description' => ts('Concatenation of all routable street address components (prefix, street number, street name, suffix, unit
number OR P.O. Box). Apps should be able to determine physical location with this data (for mapping, mail
- delivery, etc.).
- '),
+ delivery, etc.).'),
'maxlength' => 96,
'size' => CRM_Utils_Type::HUGE,
'import' => TRUE,
'name' => 'street_number_suffix',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Street Number Suffix'),
- 'description' => ts('Non-numeric portion of address number on the street, e.g. For 112A Main St, the street_number_suffix = A
- '),
+ 'description' => ts('Non-numeric portion of address number on the street, e.g. For 112A Main St, the street_number_suffix = A'),
'maxlength' => 8,
'size' => CRM_Utils_Type::EIGHT,
'where' => 'civicrm_address.street_number_suffix',
'table' => 'civicrm_county',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'state_province_id' => [
'name' => 'state_province_id',
'table' => 'civicrm_state_province',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'postal_code_suffix' => [
'name' => 'postal_code_suffix',
'keyColumn' => 'id',
'labelColumn' => 'name',
'nameColumn' => 'iso_code',
- ]
+ ],
],
'geo_code_1' => [
'name' => 'geo_code_1',
*
* Generated from xml/schema/CRM/Core/AddressFormat.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:08e72cd783856c58dbdaeee364102c01)
+ * (GenCodeChecksum:144542b9aa31391600f73d885f819091)
*/
/**
/**
* Address Format Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
*
* Generated from xml/schema/CRM/Core/Cache.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0683b150dd60e1ec9b53c00957137a27)
+ * (GenCodeChecksum:2ed8c033a46531123b2a0bb158487c30)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Component that this menu item belongs to
*
- * @var int unsigned
+ * @var int
*/
public $component_id;
'table' => 'civicrm_component',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'created_date' => [
'name' => 'created_date',
*
* Generated from xml/schema/CRM/Core/Component.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b9121c01e72b5a9a2772dad9274f4549)
+ * (GenCodeChecksum:3259789de86a7fb333ce0b11d35fe6aa)
*/
/**
/**
* Component ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
public $name;
/**
- * Path to components main directory in a form of a class
- namespace.
+ * Path to components main directory in a form of a class namespace.
*
* @var string
*/
'name' => 'namespace',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Namespace reserved for component.'),
- 'description' => ts('Path to components main directory in a form of a class
- namespace.
- '),
+ 'description' => ts('Path to components main directory in a form of a class namespace.'),
'maxlength' => 128,
'size' => CRM_Utils_Type::HUGE,
'where' => 'civicrm_component.namespace',
*
* Generated from xml/schema/CRM/Core/Country.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a7e07335fea6b1eea5894c119eaa1c4e)
+ * (GenCodeChecksum:367384a5604d933a66247bddb06e96bb)
*/
/**
/**
* Country Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to civicrm_address_format.id.
*
- * @var int unsigned
+ * @var int
*/
public $address_format_id;
/**
* Foreign key to civicrm_worldregion.id.
*
- * @var int unsigned
+ * @var int
*/
public $region_id;
/**
* Should state/province be displayed as abbreviation for contacts from this country?
*
- * @var boolean
+ * @var bool
*/
public $is_province_abbreviated;
'table' => 'civicrm_worldregion',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'is_province_abbreviated' => [
'name' => 'is_province_abbreviated',
*
* Generated from xml/schema/CRM/Core/County.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:74b37d0061cdff5aa638ff68f3879b6c)
+ * (GenCodeChecksum:3ce3045eed44f727cbca947945315329)
*/
/**
/**
* County ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* ID of State/Province that County belongs
*
- * @var int unsigned
+ * @var int
*/
public $state_province_id;
*
* Generated from xml/schema/CRM/Core/CustomField.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a1a27e2af4724a92f37a959ee359428b)
+ * (GenCodeChecksum:58323f46f5ac021f96591e075b37cca6)
*/
/**
/**
* Unique Custom Field ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_custom_group.
*
- * @var int unsigned
+ * @var int
*/
public $custom_group_id;
/**
* Is a value required for this property.
*
- * @var boolean
+ * @var bool
*/
public $is_required;
/**
* Is this property searchable.
*
- * @var boolean
+ * @var bool
*/
public $is_searchable;
/**
* Is this property range searchable.
*
- * @var boolean
+ * @var bool
*/
public $is_search_range;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this property set by PHP Code? A code field is viewable but not editable
*
- * @var boolean
+ * @var bool
*/
public $is_view;
/**
* number of options per line for checkbox and radio
*
- * @var int unsigned
+ * @var int
*/
public $options_per_line;
/**
* field length if alphanumeric
*
- * @var int unsigned
+ * @var int
*/
public $text_length;
/**
* time format for custom date
*
- * @var int unsigned
+ * @var int
*/
public $time_format;
/**
* Number of columns in Note Field
*
- * @var int unsigned
+ * @var int
*/
public $note_columns;
/**
* Number of rows in Note Field
*
- * @var int unsigned
+ * @var int
*/
public $note_rows;
/**
* For elements with options, the option group id that is used
*
- * @var int unsigned
+ * @var int
*/
public $option_group_id;
/**
* Should the multi-record custom field values be displayed in tab table listing
*
- * @var boolean
+ * @var bool
*/
public $in_selector;
'table' => 'civicrm_custom_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'name' => [
'name' => 'name',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_BAO_CustomField::dataType',
- ]
+ ],
],
'html_type' => [
'name' => 'html_type',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::customHtmlType',
- ]
+ ],
],
'default_value' => [
'name' => 'default_value',
'table' => 'civicrm_option_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'filter' => [
'name' => 'filter',
*
* Generated from xml/schema/CRM/Core/CustomGroup.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:9131714b35a45d028cf14456d1e57170)
+ * (GenCodeChecksum:288ec5d75e51339f23a2057dc1a383d2)
*/
/**
/**
* Unique Custom Group ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_option_value.id (for option group custom_data_type.)
*
- * @var int unsigned
+ * @var int
*/
public $extends_entity_column_id;
/**
* Will this group be in collapsed or expanded mode on initial display ?
*
- * @var int unsigned
+ * @var int
*/
public $collapse_display;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Does this group hold multiple values?
*
- * @var boolean
+ * @var bool
*/
public $is_multiple;
/**
* minimum number of multiple records (typically 0?)
*
- * @var int unsigned
+ * @var int
*/
public $min_multiple;
/**
* maximum number of multiple records, if 0 - no max
*
- * @var int unsigned
+ * @var int
*/
public $max_multiple;
/**
* Will this group be in collapsed or expanded mode on advanced search display ?
*
- * @var int unsigned
+ * @var int
*/
public $collapse_adv_display;
/**
* FK to civicrm_contact, who created this custom group
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* Is this a reserved Custom Group?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this property public?
*
- * @var boolean
+ * @var bool
*/
public $is_public;
'pseudoconstant' => [
'optionGroupName' => 'custom_data_type',
'optionEditPath' => 'civicrm/admin/options/custom_data_type',
- ]
+ ],
],
'extends_entity_column_value' => [
'name' => 'extends_entity_column_value',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::customGroupStyle',
- ]
+ ],
],
'collapse_display' => [
'name' => 'collapse_display',
*
* Generated from xml/schema/CRM/Core/Dashboard.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:52a635955e779405d2eaa2b403c41092)
+ * (GenCodeChecksum:d1fc3dec2d559acdfedb070a6a5bd107)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Domain for dashboard
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Is this dashlet active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this dashlet reserved?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Number of minutes to cache dashlet content in browser localStorage.
*
- * @var int unsigned
+ * @var int
*/
public $cache_minutes;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'name' => [
'name' => 'name',
*
* Generated from xml/schema/CRM/Core/Discount.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:74c8162f321ac50b965c1416951fe93a)
+ * (GenCodeChecksum:a414d91af17f5a6cfd69e3a0fc8fb8ca)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to entity table specified in entity_table column.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to civicrm_price_set
*
- * @var int unsigned
+ * @var int
*/
public $price_set_id;
*
* Generated from xml/schema/CRM/Core/Domain.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c5d80d8a9e689b48c5f6373b9229c442)
+ * (GenCodeChecksum:74b35dfcc8ad2ade69e9bcb75e2f407b)
*/
/**
/**
* Domain ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID. This is specifically not an FK to avoid circular constraints
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
*
* Generated from xml/schema/CRM/Core/Email.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:198627a1fa129294e4c7be52939883e1)
+ * (GenCodeChecksum:6da9864657d2b5e46956386ab414d8d6)
*/
/**
/**
* Unique Email ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Which Location does this email belong to.
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
/**
* Is this the primary?
*
- * @var boolean
+ * @var bool
*/
public $is_primary;
/**
* Is this the billing?
*
- * @var boolean
+ * @var bool
*/
public $is_billing;
/**
* Implicit FK to civicrm_option_value where option_group = email_on_hold.
*
- * @var int unsigned
+ * @var int
*/
public $on_hold;
/**
* Is this address for bulk mail ?
*
- * @var boolean
+ * @var bool
*/
public $is_bulkmail;
'table' => 'civicrm_location_type',
'keyColumn' => 'id',
'labelColumn' => 'display_name',
- ]
+ ],
],
'email' => [
'name' => 'email',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_PseudoConstant::emailOnHoldOptions',
- ]
+ ],
],
'is_bulkmail' => [
'name' => 'is_bulkmail',
*
* Generated from xml/schema/CRM/Core/EntityFile.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:febc5ccbfb965f8f4ba8477d4db0e5f3)
+ * (GenCodeChecksum:7a5ef1cb4866290ba8edac3fd92f1102)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to entity table specified in entity_table column.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to civicrm_file
*
- * @var int unsigned
+ * @var int
*/
public $file_id;
*
* Generated from xml/schema/CRM/Core/EntityTag.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:721b045d10e22535a86c5e927e489477)
+ * (GenCodeChecksum:16302a8c63dcb3978dbc0d089397be50)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to entity table specified in entity_table column.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to civicrm_tag
*
- * @var int unsigned
+ * @var int
*/
public $tag_id;
'pseudoconstant' => [
'optionGroupName' => 'tag_used_for',
'optionEditPath' => 'civicrm/admin/options/tag_used_for',
- ]
+ ],
],
'entity_id' => [
'name' => 'entity_id',
'table' => 'civicrm_tag',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/Extension.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:02c87fb773b6c1e61e48e0ddfac2bb5a)
+ * (GenCodeChecksum:d7421ef144f074ada5688f6e56ab8418)
*/
/**
/**
* Local Extension ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this extension active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getExtensionTypes',
- ]
+ ],
],
'full_name' => [
'name' => 'full_name',
*
* Generated from xml/schema/CRM/Core/File.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:994c11201c8b27ec0913d1ce505ef864)
+ * (GenCodeChecksum:0ddebff42aa9d0c2fe3114281ca95e70)
*/
/**
/**
* Unique ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Type of file (e.g. Transcript, Income Tax Return, etc). FK to civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $file_type_id;
/**
* FK to civicrm_contact, who uploaded this file
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
*
* Generated from xml/schema/CRM/Core/IM.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c112fd2803d82fb22d2635f7929c391c)
+ * (GenCodeChecksum:5a7b60741331c475603af3bb180d2bd7)
*/
/**
/**
* Unique IM ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Which Location does this email belong to.
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
/**
* Which IM Provider does this screen name belong to.
*
- * @var int unsigned
+ * @var int
*/
public $provider_id;
/**
* Is this the primary IM for this contact and location.
*
- * @var boolean
+ * @var bool
*/
public $is_primary;
/**
* Is this the billing?
*
- * @var boolean
+ * @var bool
*/
public $is_billing;
'table' => 'civicrm_location_type',
'keyColumn' => 'id',
'labelColumn' => 'display_name',
- ]
+ ],
],
'name' => [
'name' => 'name',
'pseudoconstant' => [
'optionGroupName' => 'instant_messenger_service',
'optionEditPath' => 'civicrm/admin/options/instant_messenger_service',
- ]
+ ],
],
'is_primary' => [
'name' => 'is_primary',
*
* Generated from xml/schema/CRM/Core/Job.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6a87295b587fb722d7b2026e2f2dbfe7)
+ * (GenCodeChecksum:752f86f1ad35917f008e81c0bc45786e)
*/
/**
/**
* Job Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this scheduled job for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Is this job active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'run_frequency' => [
'name' => 'run_frequency',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getJobFrequency',
- ]
+ ],
],
'last_run' => [
'name' => 'last_run',
*
* Generated from xml/schema/CRM/Core/JobLog.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:68e8b90d050e64feef2b1868d83a7923)
+ * (GenCodeChecksum:647390b654065a0cc421975a24ae14f9)
*/
/**
/**
* Job log entry Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this scheduled job for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Pointer to job id - not a FK though, just for logging purposes
*
- * @var int unsigned
+ * @var int
*/
public $job_id;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'run_time' => [
'name' => 'run_time',
*
* Generated from xml/schema/CRM/Core/LocBlock.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cc12c8f1ddd73d6d8b1d056dd04696e9)
+ * (GenCodeChecksum:f2893cf360fe552d5ff1d90e2eb9272c)
*/
/**
/**
* Unique ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
- * @var int unsigned
+ * @var int
*/
public $address_id;
/**
- * @var int unsigned
+ * @var int
*/
public $email_id;
/**
- * @var int unsigned
+ * @var int
*/
public $phone_id;
/**
- * @var int unsigned
+ * @var int
*/
public $im_id;
/**
- * @var int unsigned
+ * @var int
*/
public $address_2_id;
/**
- * @var int unsigned
+ * @var int
*/
public $email_2_id;
/**
- * @var int unsigned
+ * @var int
*/
public $phone_2_id;
/**
- * @var int unsigned
+ * @var int
*/
public $im_2_id;
*
* Generated from xml/schema/CRM/Core/LocationType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a97cc190a4fbeafa8846f48f47dcd63e)
+ * (GenCodeChecksum:aa147acf0dac148b113c33d4ca12876c)
*/
/**
/**
* Location Type ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this location type a predefined system location?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this location type the default?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
*
* Generated from xml/schema/CRM/Core/Log.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:38303a678c8e5104d63803ce900dc370)
+ * (GenCodeChecksum:ffaccbd0ebaf86e07a6302fe32e05ea8)
*/
/**
/**
* Log ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to the referenced item.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to Contact ID of person under whose credentials this data modification was made.
*
- * @var int unsigned
+ * @var int
*/
public $modified_id;
*
* Generated from xml/schema/CRM/Core/MailSettings.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:419c207b65557941ee6f58e31d1bb6d8)
+ * (GenCodeChecksum:1818e655bde2e2a0ecd15e7d645ba58a)
*/
/**
/**
* primary key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this match entry for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* whether this is the default set of settings for this domain
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* port to use when polling
*
- * @var int unsigned
+ * @var int
*/
public $port;
/**
* whether to use SSL or not
*
- * @var boolean
+ * @var bool
*/
public $is_ssl;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'name' => [
'name' => 'name',
'pseudoconstant' => [
'optionGroupName' => 'mail_protocol',
'optionEditPath' => 'civicrm/admin/options/mail_protocol',
- ]
+ ],
],
'server' => [
'name' => 'server',
'optionGroupName' => 'activity_status',
'keyColumn' => 'name',
'optionEditPath' => 'civicrm/admin/options/activity_status',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/Managed.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:47e95661423fb2f97b3fd2069c4e404f)
+ * (GenCodeChecksum:79f57e32601e72d62755569fbf58c801)
*/
/**
/**
* Surrogate Key
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to the referenced item.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_ManagedEntities::getCleanupOptions',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/Mapping.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:26d8aa33c9340571c606aa5b8f085c1a)
+ * (GenCodeChecksum:e0576a33199627f5846830d076b12229)
*/
/**
/**
* Mapping ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Mapping Type
*
- * @var int unsigned
+ * @var int
*/
public $mapping_type_id;
'pseudoconstant' => [
'optionGroupName' => 'mapping_type',
'optionEditPath' => 'civicrm/admin/options/mapping_type',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/MappingField.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4c827f0d31c1d9304836b198b0d93374)
+ * (GenCodeChecksum:e18a4d7c43e3fded3e10bed98437577e)
*/
/**
/**
* Mapping Field ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Mapping to which this field belongs
*
- * @var int unsigned
+ * @var int
*/
public $mapping_id;
/**
* Column number for mapping set
*
- * @var int unsigned
+ * @var int
*/
public $column_number;
/**
* Location type of this mapping, if required
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
/**
* Which type of phone does this number belongs.
*
- * @var int unsigned
+ * @var int
*/
public $phone_type_id;
/**
* Which type of IM Provider does this name belong.
*
- * @var int unsigned
+ * @var int
*/
public $im_provider_id;
/**
* Which type of website does this site belong
*
- * @var int unsigned
+ * @var int
*/
public $website_type_id;
/**
* Relationship type, if required
*
- * @var int unsigned
+ * @var int
*/
public $relationship_type_id;
/**
* Used to group mapping_field records into related sets (e.g. for criteria sets in search builder
- mappings).
+ * mappings).
*
- * @var int unsigned
+ * @var int
*/
public $grouping;
'pseudoconstant' => [
'optionGroupName' => 'instant_messenger_service',
'optionEditPath' => 'civicrm/admin/options/instant_messenger_service',
- ]
+ ],
],
'website_type_id' => [
'name' => 'website_type_id',
'pseudoconstant' => [
'optionGroupName' => 'website_type',
'optionEditPath' => 'civicrm/admin/options/website_type',
- ]
+ ],
],
'relationship_type_id' => [
'name' => 'relationship_type_id',
'type' => CRM_Utils_Type::T_INT,
'title' => ts('Grouping'),
'description' => ts('Used to group mapping_field records into related sets (e.g. for criteria sets in search builder
- mappings).
- '),
+ mappings).'),
'where' => 'civicrm_mapping_field.grouping',
'default' => '1',
'table_name' => 'civicrm_mapping_field',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getSearchBuilderOperators',
- ]
+ ],
],
'value' => [
'name' => 'value',
*
* Generated from xml/schema/CRM/Core/Menu.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ea477a411301cae7e78667099c0f654c)
+ * (GenCodeChecksum:2ba374f38c5906a6338e2c0de34208f6)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this menu item for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Component that this menu item belongs to
*
- * @var int unsigned
+ * @var int
*/
public $component_id;
/**
* Is this menu item active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this menu accessible to the public?
*
- * @var boolean
+ * @var bool
*/
public $is_public;
/**
* Is this menu exposed to the navigation system?
*
- * @var boolean
+ * @var bool
*/
public $is_exposed;
/**
* Should this menu be exposed via SSL if enabled?
*
- * @var boolean
+ * @var bool
*/
public $is_ssl;
/**
* skip this url being exposed to breadcrumb
*
- * @var boolean
+ * @var bool
*/
public $skipBreadcrumb;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'path' => [
'name' => 'path',
'table' => 'civicrm_component',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'is_active' => [
'name' => 'is_active',
*
* Generated from xml/schema/CRM/Core/MessageTemplate.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:988d404fbe6cd84e14a175f71b3f8440)
+ * (GenCodeChecksum:334135bbbd8614a2501e1cf56715eb46)
*/
/**
/**
* Message Template ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
public $msg_html;
/**
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* a pseudo-FK to civicrm_option_value
*
- * @var int unsigned
+ * @var int
*/
public $workflow_id;
/**
* is this the default message template for the workflow referenced by workflow_id?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* is this the reserved message template which we ship for the workflow referenced by workflow_id?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this message template used for sms?
*
- * @var boolean
+ * @var bool
*/
public $is_sms;
/**
* a pseudo-FK to civicrm_option_value containing PDF Page Format.
*
- * @var int unsigned
+ * @var int
*/
public $pdf_format_id;
'optionGroupName' => 'pdf_format',
'keyColumn' => 'id',
'optionEditPath' => 'civicrm/admin/options/pdf_format',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/Navigation.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f168de98d6c4d46c63abfd789f6fdf24)
+ * (GenCodeChecksum:377bbf9cfce4cb146a9638344c718b11)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this navigation item for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Parent navigation item, used for grouping
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
/**
* Is this navigation item active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* If separator needs to be added after this menu item
*
- * @var boolean
+ * @var bool
*/
public $has_separator;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'label' => [
'name' => 'label',
'keyColumn' => 'id',
'labelColumn' => 'label',
'nameColumn' => 'name',
- ]
+ ],
],
'is_active' => [
'name' => 'is_active',
*
* Generated from xml/schema/CRM/Core/Note.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:daafebd13390de67d82735263e9fa886)
+ * (GenCodeChecksum:c5b4c2796ae7a974e822e74d9e5b4338)
*/
/**
/**
* Note ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to the referenced item.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to Contact ID creator
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Core_BAO_Note::entityTables',
- ]
+ ],
],
'entity_id' => [
'name' => 'entity_id',
'pseudoconstant' => [
'optionGroupName' => 'note_privacy',
'optionEditPath' => 'civicrm/admin/options/note_privacy',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/OpenID.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8f43063bba0682c56356dbf7afa64658)
+ * (GenCodeChecksum:d63a37d228f3faa87726f65906737301)
*/
/**
/**
* Unique OpenID ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Which Location does this email belong to.
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
/**
* Whether or not this user is allowed to login
*
- * @var boolean
+ * @var bool
*/
public $allowed_to_login;
/**
* Is this the primary email for this contact and location.
*
- * @var boolean
+ * @var bool
*/
public $is_primary;
*
* Generated from xml/schema/CRM/Core/OptionGroup.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2437cfeb4ae146ce21397bb38dfa08e1)
+ * (GenCodeChecksum:c9ed24515dcc4ce676fb21518bd90791)
*/
/**
/**
* Option Group ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this a predefined system option group (i.e. it can not be deleted)?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this option group active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* A lock to remove the ability to add new options via the UI.
*
- * @var boolean
+ * @var bool
*/
public $is_locked;
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Utils_Type::dataTypes',
- ]
+ ],
],
'is_reserved' => [
'name' => 'is_reserved',
*
* Generated from xml/schema/CRM/Core/OptionValue.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:356278f04173ed064fa82cacafa7edbe)
+ * (GenCodeChecksum:803748252a3d5c50be80b18ccdb3132c)
*/
/**
/**
* Option ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Group which this option belongs to.
*
- * @var int unsigned
+ * @var int
*/
public $option_group_id;
/**
* Bitwise logic can be used to create subsets of options within an option_group for different uses.
*
- * @var int unsigned
+ * @var int
*/
public $filter;
/**
* Is this the default option for the group?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* Controls display sort order.
*
- * @var int unsigned
+ * @var int
*/
public $weight;
/**
* Is this row simply a display header? Expected usage is to render these as OPTGROUP tags within a SELECT field list of options?
*
- * @var boolean
+ * @var bool
*/
public $is_optgroup;
/**
* Is this a predefined system object?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this option active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Component that this option value belongs/caters to.
*
- * @var int unsigned
+ * @var int
*/
public $component_id;
/**
* Which Domain is this option value for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
- * @var int unsigned
+ * @var int
*/
public $visibility_id;
'table' => 'civicrm_option_group',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'label' => [
'name' => 'label',
'table' => 'civicrm_component',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'domain_id' => [
'name' => 'domain_id',
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'visibility_id' => [
'name' => 'visibility_id',
'pseudoconstant' => [
'optionGroupName' => 'visibility',
'optionEditPath' => 'civicrm/admin/options/visibility',
- ]
+ ],
],
'icon' => [
'name' => 'icon',
*
* Generated from xml/schema/CRM/Core/Persistent.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0c52f813dd1e954e1709b819128790f3)
+ * (GenCodeChecksum:4044954800a1201a4e3c376d48342f4c)
*/
/**
/**
* Persistent Record Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Config Settings
*
- * @var boolean
+ * @var bool
*/
public $is_config;
*
* Generated from xml/schema/CRM/Core/Phone.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a3b4aba6b896154133688f4318ea866b)
+ * (GenCodeChecksum:ac451e083bb4bbf26f53556086b266bf)
*/
/**
/**
* Unique Phone ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Which Location does this phone belong to.
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
/**
* Is this the primary phone for this contact and location.
*
- * @var boolean
+ * @var bool
*/
public $is_primary;
/**
* Is this the billing?
*
- * @var boolean
+ * @var bool
*/
public $is_billing;
/**
* Which Mobile Provider does this phone belong to.
*
- * @var int unsigned
+ * @var int
*/
public $mobile_provider_id;
/**
* Which type of phone does this number belongs.
*
- * @var int unsigned
+ * @var int
*/
public $phone_type_id;
'table' => 'civicrm_location_type',
'keyColumn' => 'id',
'labelColumn' => 'display_name',
- ]
+ ],
],
'is_primary' => [
'name' => 'is_primary',
'pseudoconstant' => [
'optionGroupName' => 'phone_type',
'optionEditPath' => 'civicrm/admin/options/phone_type',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/PreferencesDate.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:46e5c6a6ea6b21e1966679f41782c340)
+ * (GenCodeChecksum:18663ed2b585f1598a26a5a491c67ea6)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
*
* Generated from xml/schema/CRM/Core/PrevNextCache.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ec5d04442cf8976a3163cabeb3ba433c)
+ * (GenCodeChecksum:dba140c3d2ece863c512ed688df2ebcb)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to entity table specified in entity_table column.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id1;
/**
* FK to entity table specified in entity_table column.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id2;
public $data;
/**
- * @var boolean
+ * @var bool
*/
public $is_selected;
*
* Generated from xml/schema/CRM/Core/PrintLabel.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ca56833ea757bf1363d618add294960d)
+ * (GenCodeChecksum:2bf1df61a7093242ac2cde0d4d8ef1e0)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Implicit FK to civicrm_option_value row in NEW label_type option group
*
- * @var int unsigned
+ * @var int
*/
public $label_type_id;
/**
* Is this default?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* Is this option active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this reserved label?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* FK to civicrm_contact, who created this label layout
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
'pseudoconstant' => [
'optionGroupName' => 'name_badge',
'optionEditPath' => 'civicrm/admin/options/name_badge',
- ]
+ ],
],
'label_type_id' => [
'name' => 'label_type_id',
'pseudoconstant' => [
'optionGroupName' => 'label_type',
'optionEditPath' => 'civicrm/admin/options/label_type',
- ]
+ ],
],
'data' => [
'name' => 'data',
*
* Generated from xml/schema/CRM/Core/RecurringEntity.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:810f5bce8bb650c96703532242f254e8)
+ * (GenCodeChecksum:9e730db130a597de8528532d06f2ad54)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Recurring Entity Parent ID
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
/**
* Recurring Entity Child ID
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* 1-this entity, 2-this and the following entities, 3-all the entities
*
- * @var boolean
+ * @var bool
*/
public $mode;
*
* Generated from xml/schema/CRM/Core/Setting.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1af3984556a05189587658c306d09348)
+ * (GenCodeChecksum:7bbe096eb48d3744aa86453cccb99bfb)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this menu item for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* FK to Contact ID if the setting is localized to a contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Is this setting a contact specific or site wide setting?
*
- * @var boolean
+ * @var bool
*/
public $is_domain;
/**
* Component that this menu item belongs to
*
- * @var int unsigned
+ * @var int
*/
public $component_id;
/**
* FK to civicrm_contact, who created this setting
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'contact_id' => [
'name' => 'contact_id',
'table' => 'civicrm_component',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'created_date' => [
'name' => 'created_date',
*
* Generated from xml/schema/CRM/Core/StateProvince.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:66bbfa3f81cb6baec8d7175f5f32718a)
+ * (GenCodeChecksum:38620d39135bc4e42f0cc688dff9cb5b)
*/
/**
/**
* State/Province ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* ID of Country that State/Province belong
*
- * @var int unsigned
+ * @var int
*/
public $country_id;
*
* Generated from xml/schema/CRM/Core/StatusPreference.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b30c850f5621be00f3a7e828c7fe7c61)
+ * (GenCodeChecksum:777d59b72a077ecb4d4caa60e13bb479)
*/
/**
/**
* Unique Status Preference ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this Status Preference for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Hush messages up to and including this severity.
*
- * @var int unsigned
+ * @var int
*/
public $ignore_severity;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'name' => [
'name' => 'name',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Utils_Check::getSeverityList',
- ]
+ ],
],
'prefs' => [
'name' => 'prefs',
*
* Generated from xml/schema/CRM/Core/SystemLog.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:edcf9c070365c92afa56f7f3fe79acee)
+ * (GenCodeChecksum:a2276bcf3bb39a3947bf54b043fa0a05)
*/
/**
/**
* Primary key ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Optional Contact ID that created the log. Not an FK as we keep this regardless
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
*
* Generated from xml/schema/CRM/Core/Tag.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e66cd3973c4f223dd201904b3c59b233)
+ * (GenCodeChecksum:3abd98f177e35fd993b77bf08b115e4a)
*/
/**
/**
* Tag ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Optional parent id for this tag.
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
/**
* Is this tag selectable / displayed
*
- * @var boolean
+ * @var bool
*/
public $is_selectable;
/**
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
- * @var boolean
+ * @var bool
*/
public $is_tagset;
/**
* FK to civicrm_contact, who created this tag
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
'entity' => 'Tag',
'bao' => 'CRM_Core_BAO_Tag',
'localizable' => 0,
+ 'serialize' => self::SERIALIZE_COMMA,
'html' => [
'type' => 'Select',
],
'pseudoconstant' => [
'optionGroupName' => 'tag_used_for',
'optionEditPath' => 'civicrm/admin/options/tag_used_for',
- ]
+ ],
],
'created_id' => [
'name' => 'created_id',
*
* Generated from xml/schema/CRM/Core/Timezone.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e54363ef08090c4dfbed076c842edd03)
+ * (GenCodeChecksum:7a377d04c1e9cfede74c42b155e301f5)
*/
/**
/**
* Timezone Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Country Id
*
- * @var int unsigned
+ * @var int
*/
public $country_id;
*
* Generated from xml/schema/CRM/Core/UFField.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:3acfd1d2bd5f1e54f8aee7f96328cb58)
+ * (GenCodeChecksum:4e6400ee9a0d081541d8e14366129502)
*/
/**
/**
* Unique table ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which form does this field belong to.
*
- * @var int unsigned
+ * @var int
*/
public $uf_group_id;
/**
* Is this field currently shareable? If false, hide the field for all sharing contexts.
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* the field is view only and not editable in user forms.
*
- * @var boolean
+ * @var bool
*/
public $is_view;
/**
* Is this field required when included in a user or registration form?
*
- * @var boolean
+ * @var bool
*/
public $is_required;
/**
* Is this field included as a column in the selector table?
*
- * @var boolean
+ * @var bool
*/
public $in_selector;
/**
* Is this field included search form of profile?
*
- * @var boolean
+ * @var bool
*/
public $is_searchable;
/**
* Location type of this mapping, if required
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
/**
* Phone Type Id, if required
*
- * @var int unsigned
+ * @var int
*/
public $phone_type_id;
/**
* Website Type Id, if required
*
- * @var int unsigned
+ * @var int
*/
public $website_type_id;
/**
* Is this field reserved for use by some other CiviCRM functionality?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Include in multi-record listing?
*
- * @var boolean
+ * @var bool
*/
public $is_multi_summary;
'table' => 'civicrm_uf_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'field_name' => [
'name' => 'field_name',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Core_BAO_UFField::getAvailableFieldTitles',
- ]
+ ],
],
'is_active' => [
'name' => 'is_active',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::ufVisibility',
- ]
+ ],
],
'in_selector' => [
'name' => 'in_selector',
'pseudoconstant' => [
'optionGroupName' => 'phone_type',
'optionEditPath' => 'civicrm/admin/options/phone_type',
- ]
+ ],
],
'website_type_id' => [
'name' => 'website_type_id',
'pseudoconstant' => [
'optionGroupName' => 'website_type',
'optionEditPath' => 'civicrm/admin/options/website_type',
- ]
+ ],
],
'label' => [
'name' => 'label',
*
* Generated from xml/schema/CRM/Core/UFGroup.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0f78fb49440e1cf5d43fd3db5a43ee7e)
+ * (GenCodeChecksum:2a382dd695bc7d2ad3dca96996c5258b)
*/
/**
/**
* Unique table ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this form currently active? If false, hide all related fields for all sharing contexts.
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Group id, foreign key from civicrm_group
*
- * @var int unsigned
+ * @var int
*/
public $limit_listings_group_id;
/**
* foreign key to civicrm_group_id
*
- * @var int unsigned
+ * @var int
*/
public $add_to_group_id;
/**
* Should a CAPTCHA widget be included this Profile form.
*
- * @var boolean
+ * @var bool
*/
public $add_captcha;
/**
* Do we want to map results from this profile.
*
- * @var boolean
+ * @var bool
*/
public $is_map;
/**
* Should edit link display in profile selector
*
- * @var boolean
+ * @var bool
*/
public $is_edit_link;
/**
* Should we display a link to the website profile in profile selector
*
- * @var boolean
+ * @var bool
*/
public $is_uf_link;
/**
* Should we update the contact record if we find a duplicate
*
- * @var boolean
+ * @var bool
*/
public $is_update_dupe;
/**
* Should we create a cms user for this profile
*
- * @var boolean
+ * @var bool
*/
public $is_cms_user;
/**
* Is this group reserved for use by some other CiviCRM functionality?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* FK to civicrm_contact, who created this UF group
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* Should we include proximity search feature in this profile search form?
*
- * @var boolean
+ * @var bool
*/
public $is_proximity_search;
/**
* Should a Cancel button be included in this Profile form.
*
- * @var boolean
+ * @var bool
*/
public $add_cancel_button;
*
* Generated from xml/schema/CRM/Core/UFJoin.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:09aaa3fd826c1b3407d39966f0f11aa7)
+ * (GenCodeChecksum:00acc4bbb42aee2a24981b30456458c1)
*/
/**
/**
* Unique table ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this join currently active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Foreign key to the referenced item.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* Which form does this field belong to.
*
- * @var int unsigned
+ * @var int
*/
public $uf_group_id;
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Core_BAO_UFJoin::entityTables',
- ]
+ ],
],
'entity_id' => [
'name' => 'entity_id',
'table' => 'civicrm_uf_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'module_data' => [
'name' => 'module_data',
*
* Generated from xml/schema/CRM/Core/UFMatch.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:3dbbb5d21dec55536826e465629f7174)
+ * (GenCodeChecksum:b7305bf7df97967d214db393a34f740f)
*/
/**
/**
* System generated ID.
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this match entry for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* UF ID
*
- * @var int unsigned
+ * @var int
*/
public $uf_id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'uf_id' => [
'name' => 'uf_id',
*
* Generated from xml/schema/CRM/Core/Website.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:3c7acea3980658a252658fd11578cfbe)
+ * (GenCodeChecksum:22c11a2bc194d075912df3279acc6a97)
*/
/**
/**
* Unique Website ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Which Website type does this website belong to.
*
- * @var int unsigned
+ * @var int
*/
public $website_type_id;
'pseudoconstant' => [
'optionGroupName' => 'website_type',
'optionEditPath' => 'civicrm/admin/options/website_type',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/WordReplacement.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:df2cde8fb1f65a25db724d35387a1342)
+ * (GenCodeChecksum:1f2d0542e46494b542dce1c0132a1643)
*/
/**
/**
* Word replacement ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this entry active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* FK to Domain ID. This is for Domain specific word replacement
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getWordReplacementMatchType',
- ]
+ ],
],
'domain_id' => [
'name' => 'domain_id',
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Core/Worldregion.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f326bc6047454a630b352baf190b0cac)
+ * (GenCodeChecksum:b607c0ba0b25b3f785779384fc6a6887)
*/
/**
/**
* Country Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
if (!empty(\Civi::$statics[__CLASS__]['userFrameworkLogging'])) {
// should call $config->userSystem->logger($message) here - but I got a situation where userSystem was not an object - not sure why
if ($config->userSystem->is_drupal and function_exists('watchdog')) {
- watchdog('civicrm', '%message', ['%message' => $message], WATCHDOG_DEBUG);
+ watchdog('civicrm', '%message', ['%message' => $message], isset($priority) ? $priority : WATCHDOG_DEBUG);
}
}
$this->assign('bltID', $this->_bltID);
}
+ /**
+ * @return int
+ */
+ public function getPaymentProcessorID() {
+ return $this->_paymentProcessorID;
+ }
+
/**
* This if a front end form function for setting the payment processor.
*
else {
$this->_paymentProcessor = [];
}
- CRM_Financial_Form_Payment::addCreditCardJs($this->_paymentProcessorID);
}
- $this->assign('paymentProcessorID', $this->_paymentProcessorID);
+
// We save the fact that the profile 'billing' is required on the payment form.
// Currently pay-later is the only 'processor' that takes notice of this - but ideally
// 1) it would be possible to select the minimum_billing_profile_id for the contribution form
$label,
$options,
$required,
- NULL
+ ['class' => 'crm-select2']
);
$attributes = ['format' => 'searchDate'];
$extra = ['time' => $isDateTime];
return $this->deleteMessage;
}
+ /**
+ * Set the delete message.
+ *
+ * We do this from the constructor in order to do a translation.
+ */
+ public function setDeleteMessage() {
+ }
+
+ /**
+ * Set entity fields to be assigned to the form.
+ */
+ protected function setEntityFields() {
+ }
+
/**
* Get the entity id being edited.
*
/**
* Have we already done this search
*
- * @var boolean
+ * @var bool
*/
protected $_done;
*/
public static function formRule($fields, $files, $form) {
$errors = [];
+ if (!is_a($form, 'CRM_Core_Form_Search')) {
+ // So this gets hit with a form object when doing an activity date search from
+ // advanced search, but a NULL object when doing a pledge search.
+ return $errors;
+ }
foreach ($form->getSearchFieldMetadata() as $entity => $spec) {
foreach ($spec as $fieldName => $fieldSpec) {
if ($fieldSpec['type'] === CRM_Utils_Type::T_DATE || $fieldSpec['type'] === (CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME)) {
'filter_type' => 'xml',
'filter_path' => "{$civicrm_root}/packages/IDS/default_filter.xml",
'tmp_path' => $tmpDir,
- 'HTML_Purifier_Path' => $civicrm_root . '/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php',
+ 'HTML_Purifier_Path' => $civicrm_root . 'packages/IDS/vendors/htmlpurifer/HTMLPurifier.auto.php',
'HTML_Purifier_Cache' => $tmpDir,
'scan_keys' => '',
'exceptions' => ['__utmz', '__utmc'],
* so the display routine needs to not do any work. (The
* parent object takes care of the display)
*
- * @var boolean
+ * @var bool
*/
protected $_embedded = FALSE;
* Are we in print mode? if so we need to modify the display
* functionality to do a minimal display :)
*
- * @var boolean
+ * @var bool
*/
protected $_print = FALSE;
$mimeType = '';
$path = CRM_Core_Config::singleton()->customFileUploadDir . $fileName;
}
- $mimeType = CRM_Utils_Request::retrieveValue('mime-type', 'String', $mimeType, FALSE);
if (!$path) {
CRM_Core_Error::statusBounce('Could not retrieve the file');
}
+ if (empty($mimeType)) {
+ $passedInMimeType = self::convertBadMimeAliasTypes(CRM_Utils_Request::retrieveValue('mime-type', 'String', $mimeType, FALSE));
+ if (!in_array($passedInMimeType, explode(',', Civi::settings()->get('requestableMimeTypes')))) {
+ throw new CRM_Core_Exception("Supplied mime-type is not accepted");
+ }
+ $extension = CRM_Utils_File::getExtensionFromPath($path);
+ $candidateExtensions = CRM_Utils_File::getAcceptableExtensionsForMimeType($passedInMimeType);
+ if (!in_array($extension, $candidateExtensions)) {
+ throw new CRM_Core_Exception("Supplied mime-type does not match file extension");
+ }
+ // Now that we have validated mime-type supplied as much as possible lets now set the MimeType variable/
+ $mimeType = $passedInMimeType;
+ }
+
$buffer = file_get_contents($path);
if (!$buffer) {
CRM_Core_Error::statusBounce('The file is either empty or you do not have permission to retrieve the file');
}
}
+ /**
+ * Translate one mime type to another.
+ *
+ * Certain non-standard/weird MIME types have been common. Unfortunately, because
+ * of the way this controller is used, the weird types may baked-into URLs.
+ * We clean these up for compatibility.
+ *
+ * @param string $type
+ * Ex: 'image/jpg'
+ * @return string
+ * Ex: 'image/jpeg'.
+ */
+ protected static function convertBadMimeAliasTypes($type) {
+ $badTypes = [
+ // Before PNG format was ubiquitous, it was image/x-png?
+ 'image/x-png' => 'image/png',
+
+ // People see "image/gif" and "image/png" and wrongly guess "image/jpg"?
+ 'image/jpg' => 'image/jpeg',
+ 'image/tif' => 'image/tiff',
+ 'image/svg' => 'image/svg+xml',
+
+ // StackExchange attributes "pjpeg" to some quirk in an old version of IE?
+ 'image/pjpeg' => 'image/jpeg',
+
+ ];
+ return isset($badTypes[$type]) ? $badTypes[$type] : $type;
+ }
+
}
/**
* Calling this from outside the payment subsystem is deprecated - use doPayment.
- *
+ * @deprecated
* Does a server to server payment transaction.
*
* @param array $params
/**
* Process payment - this function wraps around both doTransferCheckout and doDirectPayment.
+ * Any processor that still implements the deprecated doTransferCheckout() or doDirectPayment() should be updated to use doPayment().
*
- * The function ensures an exception is thrown & moves some of this logic out of the form layer and makes the forms
- * more agnostic.
- *
- * Payment processors should set payment_status_id. This function adds some historical defaults ie. the
- * assumption that if a 'doDirectPayment' processors comes back it completed the transaction & in fact
- * doTransferCheckout would not traditionally come back.
- *
- * doDirectPayment does not do an immediate payment for Authorize.net or Paypal so the default is assumed
- * to be Pending.
+ * This function adds some historical defaults ie. the assumption that if a 'doDirectPayment' processors comes back it completed
+ * the transaction & in fact doTransferCheckout would not traditionally come back.
+ * Payment processors should throw exceptions and not return Error objects as they may have done with the old functions.
*
- * Once this function is fully rolled out then it will be preferred for processors to throw exceptions than to
- * return Error objects
+ * Payment processors should set payment_status_id (which is really contribution_status_id) in the returned array. The default is assumed to be Pending.
+ * In some cases the IPN will set the payment to "Completed" some time later.
*
- * Usage:
- * Payment processors should override this function directly instead of using doDirectPayment/doTransferCheckout which are deprecated.
- * Payment processors should set and return payment_status_id (Pending if the IPN will complete it, Completed if successful).
- * @fixme For the contribution workflow we have a contributionID, but for the event and membership workflow the contribution has not yet been created
- * so we can't update params directly on the contribution. However if you return trxn_id, fee_amount, net_amount they will be set on the contribution
- * by those workflows. Ideally all workflows would create a pending contribution BEFORE calling doPayment (eg. https://github.com/civicrm/civicrm-core/pull/13763 for events)
+ * @fixme Creating a contribution record is inconsistent! We should always create a contribution BEFORE calling doPayment...
+ * For the current status see: https://lab.civicrm.org/dev/financial/issues/53
+ * If we DO have a contribution ID, then the payment processor can (and should) update parameters on the contribution record as necessary.
*
* @param array $params
*
* @param string $component
*
* @return array
- * Result array
+ * Result array (containing at least the key payment_status_id)
*
* @throws \Civi\Payment\Exception\PaymentProcessorException
*/
return TRUE;
}
+ /**
+ * Supports altering future start dates
+ * @return bool
+ */
+ public function supportsFutureRecurStartDate() {
+ return TRUE;
+ }
+
/**
* Submit a refund payment
*
$xml = '<txn>';
foreach ($requestFields as $key => $value) {
- $xml .= '<' . $key . '>' . self::tidyStringforXML($value, $xmlFieldLength[$key]) . '</' . $key . '>';
+ //dev/core/966 Don't send email through the urlencode.
+ if ($key == 'ssl_email') {
+ $xml .= '<' . $key . '>' . substr($value, 0, $xmlFieldLength[$key]) . '</' . $key . '>';
+ }
+ else {
+ $xml .= '<' . $key . '>' . self::tidyStringforXML($value, $xmlFieldLength[$key]) . '</' . $key . '>';
+ }
}
$xml .= '</txn>';
return $xml;
$form->assign('suppressSubmitButton', $form->_paymentObject->isSuppressSubmitButtons());
+ CRM_Financial_Form_Payment::addCreditCardJs($form->getPaymentProcessorID());
+ $form->assign('paymentProcessorID', $form->getPaymentProcessorID());
+
$form->assign('currency', $form->getCurrency());
// also set cancel subscription url
/**
* Is this user someone with access for the entire system.
*
- * @var boolean
+ * @var bool
*/
protected $_viewAdminUser = FALSE;
protected $_editAdminUser = FALSE;
/**
* Am in in view permission or edit permission?
- * @var boolean
+ *
+ * @var bool
*/
protected $_viewPermission = FALSE;
protected $_editPermission = FALSE;
/**
* Is this user someone with access for the entire system.
*
- * @var boolean
+ * @var bool
*/
protected $_viewAdminUser = FALSE;
protected $_editAdminUser = FALSE;
/**
* Am in in view permission or edit permission?
- * @var boolean
+ * @var bool
*/
protected $_viewPermission = FALSE;
protected $_editPermission = FALSE;
/**
* Is this user someone with access for the entire system.
*
- * @var boolean
+ * @var bool
*/
protected $_viewAdminUser = FALSE;
protected $_editAdminUser = FALSE;
/**
* Am in in view permission or edit permission?
- * @var boolean
+ * @var bool
*/
protected $_viewPermission = FALSE;
protected $_editPermission = FALSE;
/**
* Is this user someone with access for the entire system.
*
- * @var boolean
+ * @var bool
*/
protected $_viewAdminUser = FALSE;
protected $_editAdminUser = FALSE;
/**
* Am in in view permission or edit permission?
- * @var boolean
+ *
+ * @var bool
*/
protected $_viewPermission = FALSE;
protected $_editPermission = FALSE;
if ($options && $flip) {
$options = array_flip($options);
}
- $customField->free();
return $options;
}
// Core field: load schema
$dao = new $daoName();
$fieldSpec = $dao->getFieldSpec($fieldName);
- $dao->free();
// Ensure we have the canonical name for this field
$fieldName = CRM_Utils_Array::value('name', $fieldSpec, $fieldName);
// Get list of fields for the option table
$dao = new $daoName();
$availableFields = array_keys($dao->fieldKeys());
- $dao->free();
$select = "SELECT %1 AS id, %2 AS label";
$from = "FROM %3";
while ($dao->fetch()) {
$output[$dao->id] = $dao->label;
}
- $dao->free();
// Localize results
if (!empty($params['localize']) || $pseudoconstant['table'] == 'civicrm_country' || $pseudoconstant['table'] == 'civicrm_state_province') {
$I18nParams = [];
/**
* Whether the snippets array has been sorted
*
- * @var boolean
+ * @var bool
*/
public $_isSorted;
$items[] = 'js/crm.menubar.js';
$items[] = Civi::service('asset_builder')->getUrl('crm-menubar.css', [
'color' => Civi::settings()->get('menubar_color'),
+ 'height' => 40,
+ 'breakpoint' => 768,
+ 'opacity' => .88,
]);
$items[] = [
'menubar' => [
}
$vars = [
'resourceBase' => rtrim($config->resourceBase, '/'),
+ 'menubarHeight' => $e->params['height'] . 'px',
+ 'breakMin' => $e->params['breakpoint'] . 'px',
+ 'breakMax' => ($e->params['breakpoint'] - 1) . 'px',
'menubarColor' => $color,
- 'semiTransparentMenuColor' => 'rgba(' . implode(', ', CRM_Utils_Color::getRgb($color)) . ', .85)',
+ 'menuItemColor' => 'rgba(' . implode(', ', CRM_Utils_Color::getRgb($color)) . ", {$e->params['opacity']})",
'highlightColor' => CRM_Utils_Color::getHighlight($color),
'textColor' => CRM_Utils_Color::getContrast($color, '#333', '#ddd'),
];
protected $_fileName;
/**
- * #@+
- * @var integer
- */
-
- /**
- * Imported file size
+ * Imported file size.
+ *
* @var int
*/
protected $_fileSize;
/**
* Whether the file has a column header or not
*
- * @var boolean
+ * @var bool
*/
protected $_haveColumnHeader;
*
* Generated from xml/schema/CRM/Cxn/Cxn.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:999790d380fa004a25265a1a0126fb95)
+ * (GenCodeChecksum:bd6f3b0785ec9b05984d8ad32f3b8464)
*/
/**
/**
* Connection ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is connection currently enabled?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
*
* Generated from xml/schema/CRM/Dedupe/Exception.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1f39e9ee1f80da1b62c054f6ca4119c5)
+ * (GenCodeChecksum:eec5ad673402f603903d6f35ad1bcd06)
*/
/**
/**
* Unique dedupe exception id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id1;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id2;
*
* Generated from xml/schema/CRM/Dedupe/Rule.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:99420d466d2982510873b69c179fd9f5)
+ * (GenCodeChecksum:a7697e9d93641b3240e23f97f4f92329)
*/
/**
/**
* Unique dedupe rule id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* The id of the rule group this rule belongs to
*
- * @var int unsigned
+ * @var int
*/
public $dedupe_rule_group_id;
/**
* The length of the matching substring
*
- * @var int unsigned
+ * @var int
*/
public $rule_length;
*
* Generated from xml/schema/CRM/Dedupe/RuleGroup.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:85fc439e89d4d0dfd403efdd1cf67531)
+ * (GenCodeChecksum:a0c7d9e893a3aec240db9ec4b0e8729d)
*/
/**
/**
* Unique dedupe rule group id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this a reserved rule - a rule group that has been optimized and cannot be changed by the admin
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
'keyColumn' => 'name',
'labelColumn' => 'label',
'condition' => 'parent_id IS NULL',
- ]
+ ],
],
'threshold' => [
'name' => 'threshold',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getDedupeRuleTypes',
- ]
+ ],
],
'name' => [
'name' => 'name',
// Allow hook_civicrm_merge() to add SQL statements for the merge operation.
CRM_Utils_Hook::merge('sqls', $sqls, $mainId, $otherId, $tables);
- // call the SQL queries in one transaction
- $transaction = new CRM_Core_Transaction();
foreach ($sqls as $sql) {
CRM_Core_DAO::executeQuery($sql, [], TRUE, NULL, TRUE);
}
CRM_Dedupe_Merger::addMembershipToRealtedContacts($mainId);
- $transaction->commit();
}
/**
// explicitly set to NULL if not 1 or 0 as part of grandfathering out the mystical '2' value.
$isSelected = NULL;
}
- $dupePairs = self::getDuplicatePairs($rgid, $gid, $reloadCacheIfEmpty, $batchLimit, $isSelected, '', ($mode == 'aggressive'), $criteria, $checkPermissions);
+ $dupePairs = self::getDuplicatePairs($rgid, $gid, $reloadCacheIfEmpty, $batchLimit, $isSelected, ($mode == 'aggressive'), $criteria, $checkPermissions);
$cacheParams = [
'cache_key_string' => self::getMergeCacheKeyString($rgid, $gid, $criteria, $checkPermissions),
* - Does a force merge otherwise (aggressive mode).
*
* @param array $conflicts
+ * An empty array to be filed with conflict information.
*
* @return bool
*/
public static function skipMerge($mainId, $otherId, &$migrationInfo, $mode = 'safe', &$conflicts = []) {
- $originalMigrationInfo = $migrationInfo;
- foreach ($migrationInfo as $key => $val) {
- if ($val === "null") {
- // Rule: Never overwrite with an empty value (in any mode)
- unset($migrationInfo[$key]);
- continue;
- }
- elseif ((in_array(substr($key, 5), CRM_Dedupe_Merger::getContactFields()) or
- substr($key, 0, 12) == 'move_custom_'
- ) and $val != NULL
- ) {
- // Rule: If both main-contact, and other-contact have a field with a
- // different value, then let $mode decide if to merge it or not
- if (
- (!empty($migrationInfo['rows'][$key]['main'])
- // For custom fields a 0 (e.g in an int field) could be a true conflict. This
- // is probably true for other fields too - e.g. 'do_not_email' but
- // leaving that investigation as a @todo - until tests can be written.
- // Note the handling of this has test coverage - although the data-typing
- // of '0' feels flakey we have insurance.
- || ($migrationInfo['rows'][$key]['main'] === '0' && substr($key, 0, 12) == 'move_custom_')
- )
- && $migrationInfo['rows'][$key]['main'] != $migrationInfo['rows'][$key]['other']
- ) {
-
- // note it down & lets wait for response from the hook.
- // For no response $mode will decide if to skip this merge
- $conflicts[$key] = NULL;
- }
- }
- elseif (substr($key, 0, 14) == 'move_location_' and $val != NULL) {
- $locField = explode('_', $key);
- $fieldName = $locField[2];
- $fieldCount = $locField[3];
-
- // Rule: Catch address conflicts (same address type on both contacts)
- if (
- isset($migrationInfo['main_details']['location_blocks'][$fieldName]) &&
- !empty($migrationInfo['main_details']['location_blocks'][$fieldName])
- ) {
-
- // Load the address we're inspecting from the 'other' contact
- $addressRecord = $migrationInfo['other_details']['location_blocks'][$fieldName][$fieldCount];
- $addressRecordLocTypeId = CRM_Utils_Array::value('location_type_id', $addressRecord);
-
- // If it exists on the 'main' contact already, skip it. Otherwise
- // if the location type exists already, log a conflict.
- foreach ($migrationInfo['main_details']['location_blocks'][$fieldName] as $mainAddressKey => $mainAddressRecord) {
- if (self::locationIsSame($addressRecord, $mainAddressRecord)) {
- unset($migrationInfo[$key]);
- break;
- }
- elseif ($addressRecordLocTypeId == $mainAddressRecord['location_type_id']) {
- $conflicts[$key] = NULL;
- break;
- }
- }
- }
-
- // For other locations, don't merge/add if the values are the same
- elseif (CRM_Utils_Array::value('main', $migrationInfo['rows'][$key]) == $migrationInfo['rows'][$key]['other']) {
- unset($migrationInfo[$key]);
- }
- }
- }
-
- // A hook to implement other algorithms for choosing which contact to bias to when
- // there's a conflict (to handle "gotchas"). fields_in_conflict could be modified here
- // merge happens with new values filled in here. For a particular field / row not to be merged
- // field should be unset from fields_in_conflict.
- $migrationData = [
- 'old_migration_info' => $originalMigrationInfo,
- 'mode' => $mode,
- 'fields_in_conflict' => $conflicts,
- 'merge_mode' => $mode,
- 'migration_info' => $migrationInfo,
- ];
- CRM_Utils_Hook::merge('batch', $migrationData, $mainId, $otherId);
- $conflicts = $migrationData['fields_in_conflict'];
- // allow hook to override / manipulate migrationInfo as well
- $migrationInfo = $migrationData['migration_info'];
+ $conflicts = self::getConflicts($migrationInfo, $mainId, $otherId, $mode);
if (!empty($conflicts)) {
foreach ($conflicts as $key => $val) {
}
}
// if there are conflicts and mode is aggressive, allow hooks to decide if to skip merges
- if (array_key_exists('skip_merge', $migrationData)) {
- return (bool) $migrationData['skip_merge'];
- }
+ return (bool) $migrationInfo['skip_merge'];
}
return FALSE;
}
$main = self::getMergeContactDetails($mainId);
$other = self::getMergeContactDetails($otherId);
- $specialValues['main'] = self::getSpecialValues($main);
- $specialValues['other'] = self::getSpecialValues($other);
$compareFields = self::retrieveFields($main, $other);
// CRM-15681 don't display sub-types in UI
continue;
}
- foreach (['main', 'other'] as $moniker) {
- $contact = &$$moniker;
- $value = CRM_Utils_Array::value($field, $contact);
- if (isset($specialValues[$moniker][$field]) && is_string($specialValues[$moniker][$field])) {
- $value = CRM_Core_DAO::VALUE_SEPARATOR . trim($specialValues[$moniker][$field], CRM_Core_DAO::VALUE_SEPARATOR) . CRM_Core_DAO::VALUE_SEPARATOR;
+ foreach (['main' => $main, 'other' => $other] as $moniker => $contact) {
+ $value = $label = CRM_Utils_Array::value($field, $contact);
+ $fieldSpec = $fields[$field];
+ if (!empty($fieldSpec['serialize']) && is_array($value)) {
+ // In practice this only applies to preferred_communication_method as the sub types are skipped above
+ // and no others are serialized.
+ $labels = [];
+ foreach ($value as $individualValue) {
+ $labels[] = CRM_Core_PseudoConstant::getLabel('CRM_Contact_BAO_Contact', $field, $individualValue);
+ }
+ $label = implode(', ', $labels);
+ // We serialize this due to historic handling but it's likely that if we just left it as an
+ // array all would be well & we would have less code.
+ $value = CRM_Core_DAO::serializeField($value, $fieldSpec['serialize']);
}
- $label = isset($specialValues[$moniker]["{$field}_display"]) ? $specialValues[$moniker]["{$field}_display"] : $value;
- if (!empty($fields[$field]['type']) && $fields[$field]['type'] == CRM_Utils_Type::T_DATE) {
+ elseif (!empty($fieldSpec['type']) && $fieldSpec['type'] == CRM_Utils_Type::T_DATE) {
if ($value) {
$value = str_replace('-', '', $value);
$label = CRM_Utils_Date::customFormat($label);
$label = ts('[x]');
}
}
- elseif ($field == 'prefix_id') {
- $label = CRM_Utils_Array::value('individual_prefix', $contact);
- }
- elseif ($field == 'suffix_id') {
- $label = CRM_Utils_Array::value('individual_suffix', $contact);
- }
- elseif ($field == 'gender_id' && !empty($value)) {
- $genderOptions = civicrm_api3('contact', 'getoptions', ['field' => 'gender_id']);
- $label = $genderOptions['values'][$value];
+ elseif (!empty($fieldSpec['pseudoconstant'])) {
+ $label = CRM_Core_PseudoConstant::getLabel('CRM_Contact_BAO_Contact', $field, $value);
}
elseif ($field == 'current_employer_id' && !empty($value)) {
$label = "$value (" . CRM_Contact_BAO_Contact::displayName($value) . ")";
if (empty($migrationInfo)) {
return FALSE;
}
+ // Encapsulate in a transaction to avoid half-merges.
+ $transaction = new CRM_Core_Transaction();
- $qfZeroBug = 'e8cddb72-a257-11dc-b9cc-0016d3330ee9';
+ $contactType = $migrationInfo['main_details']['contact_type'];
$relTables = CRM_Dedupe_Merger::relTables();
- $submittedCustomFields = $moveTables = $locationMigrationInfo = $tableOperations = $removeTables = [];
+ $submittedCustomFields = $moveTables = $tableOperations = $removeTables = [];
+ self::swapOutFieldsAffectedByQFZeroBug($migrationInfo);
foreach ($migrationInfo as $key => $value) {
- if ($value == $qfZeroBug) {
- $value = '0';
- }
if (substr($key, 0, 12) == 'move_custom_' && $value != NULL) {
$submitted[substr($key, 5)] = $value;
elseif (in_array(substr($key, 5), CRM_Dedupe_Merger::getContactFields()) && $value != NULL) {
$submitted[substr($key, 5)] = $value;
}
- // Set up initial information for handling migration of location blocks
- elseif (substr($key, 0, 14) == 'move_location_' and $value != NULL) {
- $locationMigrationInfo[$key] = $value;
- }
elseif (substr($key, 0, 15) == 'move_rel_table_' and $value == '1') {
$moveTables = array_merge($moveTables, $relTables[substr($key, 5)]['tables']);
if (array_key_exists('operation', $migrationInfo)) {
$removeTables = array_merge($moveTables, $relTables[substr($key, 5)]['tables']);
}
}
- self::mergeLocations($mainId, $otherId, $locationMigrationInfo, $migrationInfo);
+ self::mergeLocations($mainId, $otherId, $migrationInfo);
// **** Do contact related migrations
$customTablesToCopyValues = self::getAffectedCustomTables($submittedCustomFields);
'groupName' => 'postal_greeting',
];
CRM_Core_OptionGroup::lookupValues($submitted, $names, TRUE);
-
// fix custom fields so they're edible by createProfileContact()
- $treeCache = [];
- if (!array_key_exists($migrationInfo['main_details']['contact_type'], $treeCache)) {
- $treeCache[$migrationInfo['main_details']['contact_type']] = CRM_Core_BAO_CustomGroup::getTree(
- $migrationInfo['main_details']['contact_type'],
- NULL,
- NULL,
- -1,
- [],
- NULL,
- TRUE,
- NULL,
- FALSE,
- FALSE
- );
- }
-
- $cFields = [];
- foreach ($treeCache[$migrationInfo['main_details']['contact_type']] as $key => $group) {
- if (!isset($group['fields'])) {
- continue;
- }
- foreach ($group['fields'] as $fid => $field) {
- $cFields[$fid]['attributes'] = $field;
- }
- }
+ $cFields = self::getCustomFieldMetadata($contactType);
if (!isset($submitted)) {
$submitted = [];
}
+ $customFiles = [];
foreach ($submitted as $key => $value) {
- if (substr($key, 0, 7) == 'custom_') {
- $fid = (int) substr($key, 7);
- if (empty($cFields[$fid])) {
- continue;
- }
- $htmlType = $cFields[$fid]['attributes']['html_type'];
- switch ($htmlType) {
- case 'File':
- $customFiles[] = $fid;
- unset($submitted["custom_$fid"]);
- break;
-
- case 'Select Country':
- case 'Select State/Province':
- $submitted[$key] = CRM_Core_BAO_CustomField::displayValue($value, $fid);
- break;
-
- case 'Select Date':
- if ($cFields[$fid]['attributes']['is_view']) {
- $submitted[$key] = date('YmdHis', strtotime($submitted[$key]));
- }
- break;
-
- case 'CheckBox':
- case 'Multi-Select':
- case 'Multi-Select Country':
- case 'Multi-Select State/Province':
- // Merge values from both contacts for multivalue fields, CRM-4385
- // get the existing custom values from db.
- $customParams = ['entityID' => $mainId, $key => TRUE];
- $customfieldValues = CRM_Core_BAO_CustomValueTable::getValues($customParams);
- if (!empty($customfieldValues[$key])) {
- $existingValue = explode(CRM_Core_DAO::VALUE_SEPARATOR, $customfieldValues[$key]);
- if (is_array($existingValue) && !empty($existingValue)) {
- $mergeValue = $submittedCustomFields = [];
- if ($value == 'null') {
- // CRM-19074 if someone has deliberately chosen to overwrite with 'null', respect it.
- $submitted[$key] = $value;
- }
- else {
- if ($value) {
- $submittedCustomFields = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
- }
-
- // CRM-19653: overwrite or add the existing custom field value with dupicate contact's
- // custom field value stored at $submittedCustomValue.
- foreach ($submittedCustomFields as $k => $v) {
- if ($v != '' && !in_array($v, $mergeValue)) {
- $mergeValue[] = $v;
- }
- }
-
- //keep state and country as array format.
- //for checkbox and m-select format w/ VALUE_SEPARATOR
- if (in_array($htmlType, [
- 'CheckBox',
- 'Multi-Select',
- ])) {
- $submitted[$key] = CRM_Core_DAO::VALUE_SEPARATOR . implode(CRM_Core_DAO::VALUE_SEPARATOR,
- $mergeValue
- ) . CRM_Core_DAO::VALUE_SEPARATOR;
- }
- else {
- $submitted[$key] = $mergeValue;
- }
- }
- }
- }
- elseif (in_array($htmlType, [
- 'Multi-Select Country',
- 'Multi-Select State/Province',
- ])) {
- //we require submitted values should be in array format
- if ($value) {
- $mergeValueArray = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
- //hack to remove null values from array.
- $mergeValue = [];
- foreach ($mergeValueArray as $k => $v) {
- if ($v != '') {
- $mergeValue[] = $v;
- }
- }
- $submitted[$key] = $mergeValue;
- }
- }
- break;
-
- default:
- break;
- }
- }
+ list($cFields, $customFiles, $submitted) = self::processCustomFields($mainId, $key, $cFields, $customFiles, $submitted, $value);
}
- // **** Do file custom fields related migrations
- // FIXME: move this someplace else (one of the BAOs) after discussing
- // where to, and whether CRM_Core_BAO_File::deleteFileReferences() shouldn't actually,
- // like, delete a file...
-
- if (!isset($customFiles)) {
- $customFiles = [];
- }
- foreach ($customFiles as $customId) {
- list($tableName, $columnName, $groupID) = CRM_Core_BAO_CustomField::getTableColumnGroup($customId);
-
- // get the contact_id -> file_id mapping
- $fileIds = [];
- $sql = "SELECT entity_id, {$columnName} AS file_id FROM {$tableName} WHERE entity_id IN ({$mainId}, {$otherId})";
- $dao = CRM_Core_DAO::executeQuery($sql);
- while ($dao->fetch()) {
- $fileIds[$dao->entity_id] = $dao->file_id;
- if ($dao->entity_id == $mainId) {
- CRM_Core_BAO_File::deleteFileReferences($fileIds[$mainId], $mainId, $customId);
- }
- }
-
- // move the other contact's file to main contact
- //NYSS need to INSERT or UPDATE depending on whether main contact has an existing record
- if (CRM_Core_DAO::singleValueQuery("SELECT id FROM {$tableName} WHERE entity_id = {$mainId}")) {
- $sql = "UPDATE {$tableName} SET {$columnName} = {$fileIds[$otherId]} WHERE entity_id = {$mainId}";
- }
- else {
- $sql = "INSERT INTO {$tableName} ( entity_id, {$columnName} ) VALUES ( {$mainId}, {$fileIds[$otherId]} )";
- }
- CRM_Core_DAO::executeQuery($sql);
-
- if (CRM_Core_DAO::singleValueQuery("
- SELECT id
- FROM civicrm_entity_file
- WHERE entity_table = '{$tableName}' AND file_id = {$fileIds[$otherId]}")
- ) {
- $sql = "
- UPDATE civicrm_entity_file
- SET entity_id = {$mainId}
- WHERE entity_table = '{$tableName}' AND file_id = {$fileIds[$otherId]}";
- }
- else {
- $sql = "
- INSERT INTO civicrm_entity_file ( entity_table, entity_id, file_id )
- VALUES ( '{$tableName}', {$mainId}, {$fileIds[$otherId]} )";
- }
- CRM_Core_DAO::executeQuery($sql);
- }
+ self::processCustomFieldFiles($mainId, $otherId, $customFiles);
// move view only custom fields CRM-5362
$viewOnlyCustomFields = [];
CRM_Contact_BAO_Contact::createProfileContact($submitted, CRM_Core_DAO::$_nullArray, $mainId);
}
-
+ $transaction->commit();
CRM_Utils_Hook::post('merge', 'Contact', $mainId);
self::createMergeActivities($mainId, $otherId);
* @param int $batchLimit
* @param bool $isSelected
* Limit to selected pairs.
- * @param array|string $orderByClause
* @param bool $includeConflicts
* @param array $criteria
* Additional criteria to narrow down the merge group.
*
* @return array
* Array of matches meeting the criteria.
+ *
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
*/
- public static function getDuplicatePairs($rule_group_id, $group_id, $reloadCacheIfEmpty, $batchLimit, $isSelected, $orderByClause = '', $includeConflicts = TRUE, $criteria = [], $checkPermissions = TRUE, $searchLimit = 0) {
+ public static function getDuplicatePairs($rule_group_id, $group_id, $reloadCacheIfEmpty, $batchLimit, $isSelected, $includeConflicts = TRUE, $criteria = [], $checkPermissions = TRUE, $searchLimit = 0) {
$where = self::getWhereString($isSelected);
$cacheKeyString = self::getMergeCacheKeyString($rule_group_id, $group_id, $criteria, $checkPermissions);
$join = self::getJoinOnDedupeTable();
- $dupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, $join, $where, 0, $batchLimit, [], $orderByClause, $includeConflicts);
+ $dupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, $join, $where, 0, $batchLimit, [], '', $includeConflicts);
if (empty($dupePairs) && $reloadCacheIfEmpty) {
// If we haven't found any dupes, probably cache is empty.
// Try filling cache and give another try. We don't need to specify include conflicts here are there will not be any
// until we have done some processing.
CRM_Core_BAO_PrevNextCache::refillCache($rule_group_id, $group_id, $cacheKeyString, $criteria, $checkPermissions, $searchLimit);
- $dupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, $join, $where, 0, $batchLimit, [], $orderByClause, $includeConflicts);
+ $dupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, $join, $where, 0, $batchLimit, [], '', $includeConflicts);
return $dupePairs;
}
return $dupePairs;
return $cacheKeyString;
}
- /**
- * @param array $contact
- * @return array
- * $specialValues
- */
- public static function getSpecialValues($contact) {
- $preferred_communication_method = CRM_Utils_Array::value('preferred_communication_method', $contact);
- $value = empty($preferred_communication_method) ? [] : $preferred_communication_method;
- $specialValues = [
- 'preferred_communication_method' => $value,
- 'communication_style_id' => $value,
- ];
-
- if (!empty($contact['preferred_communication_method'])) {
- // api 3 returns pref_comm_method as an array, which breaks the lookup; so we reconstruct
- $prefCommList = is_array($specialValues['preferred_communication_method']) ? implode(CRM_Core_DAO::VALUE_SEPARATOR, $specialValues['preferred_communication_method']) : $specialValues['preferred_communication_method'];
- $specialValues['preferred_communication_method'] = CRM_Core_DAO::VALUE_SEPARATOR . $prefCommList . CRM_Core_DAO::VALUE_SEPARATOR;
- }
- $names = [
- 'preferred_communication_method' => [
- 'newName' => 'preferred_communication_method_display',
- 'groupName' => 'preferred_communication_method',
- ],
- ];
- CRM_Core_OptionGroup::lookupValues($specialValues, $names);
-
- if (!empty($contact['communication_style'])) {
- $specialValues['communication_style_id_display'] = $contact['communication_style'];
- }
- return $specialValues;
- }
-
/**
* Get the metadata for the merge fields.
*
*
* @param int $mainId
* @param int $otherId
- * @param array $locationMigrationInfo
- * Portion of the migration_info that holds location migration information.
*
* @param array $migrationInfo
* Migration info for the merge. This is passed to the hook as informational only.
*/
- public static function mergeLocations($mainId, $otherId, $locationMigrationInfo, $migrationInfo) {
- foreach ($locationMigrationInfo as $key => $value) {
+ public static function mergeLocations($mainId, $otherId, $migrationInfo) {
+ foreach ($migrationInfo as $key => $value) {
+ $isLocationField = (substr($key, 0, 14) == 'move_location_' and $value != NULL);
+ if (!$isLocationField) {
+ continue;
+ }
$locField = explode('_', $key);
$fieldName = $locField[2];
$fieldCount = $locField[3];
CRM_Core_BAO_PrevNextCache::markConflict($mainId, $otherId, $cacheKeyString, $conflicts);
}
else {
- // delete entry from PrevNextCache table so we don't consider the pair next time
- // pair may have been flipped, so make sure we delete using both orders
- CRM_Core_BAO_PrevNextCache::deletePair($mainId, $otherId, $cacheKeyString, TRUE);
+ CRM_Core_BAO_PrevNextCache::deletePair($mainId, $otherId, $cacheKeyString);
+ }
+ }
+
+ /**
+ * Replace the pseudo QFKey with zero if it is present.
+ *
+ * @todo - on the slim chance this is still relevant it should be moved to the form layer.
+ *
+ * Details about this bug are somewhat obscured by the move from svn but perhaps JIRA
+ * can still help.
+ *
+ * @param array $migrationInfo
+ */
+ protected static function swapOutFieldsAffectedByQFZeroBug(&$migrationInfo) {
+ $qfZeroBug = 'e8cddb72-a257-11dc-b9cc-0016d3330ee9';
+ foreach ($migrationInfo as $key => &$value) {
+ if ($value == $qfZeroBug) {
+ $value = '0';
+ }
+ }
+ }
+
+ /**
+ * Honestly - what DOES this do - hopefully some refactoring will reveal it's purpose.
+ *
+ * @param $mainId
+ * @param $key
+ * @param $cFields
+ * @param $customFiles
+ * @param $submitted
+ * @param $value
+ *
+ * @return array
+ */
+ protected static function processCustomFields($mainId, $key, $cFields, $customFiles, $submitted, $value) {
+ if (substr($key, 0, 7) == 'custom_') {
+ $fid = (int) substr($key, 7);
+ if (empty($cFields[$fid])) {
+ return [$cFields, $customFiles, $submitted];
+ }
+ $htmlType = $cFields[$fid]['attributes']['html_type'];
+ switch ($htmlType) {
+ case 'File':
+ $customFiles[] = $fid;
+ unset($submitted["custom_$fid"]);
+ break;
+
+ case 'Select Country':
+ case 'Select State/Province':
+ $submitted[$key] = CRM_Core_BAO_CustomField::displayValue($value, $fid);
+ break;
+
+ case 'Select Date':
+ if ($cFields[$fid]['attributes']['is_view']) {
+ $submitted[$key] = date('YmdHis', strtotime($submitted[$key]));
+ }
+ break;
+
+ case 'CheckBox':
+ case 'Multi-Select':
+ case 'Multi-Select Country':
+ case 'Multi-Select State/Province':
+ // Merge values from both contacts for multivalue fields, CRM-4385
+ // get the existing custom values from db.
+ $customParams = ['entityID' => $mainId, $key => TRUE];
+ $customfieldValues = CRM_Core_BAO_CustomValueTable::getValues($customParams);
+ if (!empty($customfieldValues[$key])) {
+ $existingValue = explode(CRM_Core_DAO::VALUE_SEPARATOR, $customfieldValues[$key]);
+ if (is_array($existingValue) && !empty($existingValue)) {
+ $mergeValue = $submittedCustomFields = [];
+ if ($value == 'null') {
+ // CRM-19074 if someone has deliberately chosen to overwrite with 'null', respect it.
+ $submitted[$key] = $value;
+ }
+ else {
+ if ($value) {
+ $submittedCustomFields = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
+ }
+
+ // CRM-19653: overwrite or add the existing custom field value with dupicate contact's
+ // custom field value stored at $submittedCustomValue.
+ foreach ($submittedCustomFields as $k => $v) {
+ if ($v != '' && !in_array($v, $mergeValue)) {
+ $mergeValue[] = $v;
+ }
+ }
+
+ //keep state and country as array format.
+ //for checkbox and m-select format w/ VALUE_SEPARATOR
+ if (in_array($htmlType, [
+ 'CheckBox',
+ 'Multi-Select',
+ ])) {
+ $submitted[$key] = CRM_Core_DAO::VALUE_SEPARATOR . implode(CRM_Core_DAO::VALUE_SEPARATOR,
+ $mergeValue
+ ) . CRM_Core_DAO::VALUE_SEPARATOR;
+ }
+ else {
+ $submitted[$key] = $mergeValue;
+ }
+ }
+ }
+ }
+ elseif (in_array($htmlType, [
+ 'Multi-Select Country',
+ 'Multi-Select State/Province',
+ ])) {
+ //we require submitted values should be in array format
+ if ($value) {
+ $mergeValueArray = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
+ //hack to remove null values from array.
+ $mergeValue = [];
+ foreach ($mergeValueArray as $k => $v) {
+ if ($v != '') {
+ $mergeValue[] = $v;
+ }
+ }
+ $submitted[$key] = $mergeValue;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ return [$cFields, $customFiles, $submitted];
+ }
+
+ /**
+ * Get metadata for the custom fields for the merge.
+ *
+ * @param string $contactType
+ *
+ * @return array
+ */
+ protected static function getCustomFieldMetadata($contactType) {
+ $treeCache = [];
+ if (!array_key_exists($contactType, $treeCache)) {
+ $treeCache[$contactType] = CRM_Core_BAO_CustomGroup::getTree(
+ $contactType,
+ NULL,
+ NULL,
+ -1,
+ [],
+ NULL,
+ TRUE,
+ NULL,
+ FALSE,
+ FALSE
+ );
+ }
+
+ $cFields = [];
+ foreach ($treeCache[$contactType] as $key => $group) {
+ if (!isset($group['fields'])) {
+ continue;
+ }
+ foreach ($group['fields'] as $fid => $field) {
+ $cFields[$fid]['attributes'] = $field;
+ }
+ }
+ return $cFields;
+ }
+
+ /**
+ * Get conflicts for proposed merge pair.
+ *
+ * @param array $migrationInfo
+ * This is primarily to inform hooks. The can also modify it which feels
+ * pretty fragile to do it here - but it is historical.
+ * @param int $mainId
+ * Main contact with whom merge has to happen.
+ * @param int $otherId
+ * Duplicate contact which would be deleted after merge operation.
+ * @param string $mode
+ * Helps decide how to behave when there are conflicts.
+ * - A 'safe' value skips the merge if there are any un-resolved conflicts.
+ * - Does a force merge otherwise (aggressive mode).
+ *
+ * @return array
+ */
+ public static function getConflicts(&$migrationInfo, $mainId, $otherId, $mode) {
+ $conflicts = [];
+ $originalMigrationInfo = $migrationInfo;
+ foreach ($migrationInfo as $key => $val) {
+ if ($val === "null") {
+ // Rule: Never overwrite with an empty value (in any mode)
+ unset($migrationInfo[$key]);
+ continue;
+ }
+ elseif ((in_array(substr($key, 5), CRM_Dedupe_Merger::getContactFields()) or
+ substr($key, 0, 12) == 'move_custom_'
+ ) and $val != NULL
+ ) {
+ // Rule: If both main-contact, and other-contact have a field with a
+ // different value, then let $mode decide if to merge it or not
+ if (
+ (!empty($migrationInfo['rows'][$key]['main'])
+ // For custom fields a 0 (e.g in an int field) could be a true conflict. This
+ // is probably true for other fields too - e.g. 'do_not_email' but
+ // leaving that investigation as a @todo - until tests can be written.
+ // Note the handling of this has test coverage - although the data-typing
+ // of '0' feels flakey we have insurance.
+ || ($migrationInfo['rows'][$key]['main'] === '0' && substr($key, 0, 12) == 'move_custom_')
+ )
+ && $migrationInfo['rows'][$key]['main'] != $migrationInfo['rows'][$key]['other']
+ ) {
+
+ // note it down & lets wait for response from the hook.
+ // For no response $mode will decide if to skip this merge
+ $conflicts[$key] = NULL;
+ }
+ }
+ elseif (substr($key, 0, 14) == 'move_location_' and $val != NULL) {
+ $locField = explode('_', $key);
+ $fieldName = $locField[2];
+ $fieldCount = $locField[3];
+
+ // Rule: Catch address conflicts (same address type on both contacts)
+ if (
+ isset($migrationInfo['main_details']['location_blocks'][$fieldName]) &&
+ !empty($migrationInfo['main_details']['location_blocks'][$fieldName])
+ ) {
+
+ // Load the address we're inspecting from the 'other' contact
+ $addressRecord = $migrationInfo['other_details']['location_blocks'][$fieldName][$fieldCount];
+ $addressRecordLocTypeId = CRM_Utils_Array::value('location_type_id', $addressRecord);
+
+ // If it exists on the 'main' contact already, skip it. Otherwise
+ // if the location type exists already, log a conflict.
+ foreach ($migrationInfo['main_details']['location_blocks'][$fieldName] as $mainAddressKey => $mainAddressRecord) {
+ if (self::locationIsSame($addressRecord, $mainAddressRecord)) {
+ unset($migrationInfo[$key]);
+ break;
+ }
+ elseif ($addressRecordLocTypeId == $mainAddressRecord['location_type_id']) {
+ $conflicts[$key] = NULL;
+ break;
+ }
+ }
+ }
+
+ // For other locations, don't merge/add if the values are the same
+ elseif (CRM_Utils_Array::value('main', $migrationInfo['rows'][$key]) == $migrationInfo['rows'][$key]['other']) {
+ unset($migrationInfo[$key]);
+ }
+ }
+ }
+
+ // A hook to implement other algorithms for choosing which contact to bias to when
+ // there's a conflict (to handle "gotchas"). fields_in_conflict could be modified here
+ // merge happens with new values filled in here. For a particular field / row not to be merged
+ // field should be unset from fields_in_conflict.
+ $migrationData = [
+ 'old_migration_info' => $originalMigrationInfo,
+ 'mode' => $mode,
+ 'fields_in_conflict' => $conflicts,
+ 'merge_mode' => $mode,
+ 'migration_info' => $migrationInfo,
+ ];
+ CRM_Utils_Hook::merge('batch', $migrationData, $mainId, $otherId);
+ $conflicts = $migrationData['fields_in_conflict'];
+ // allow hook to override / manipulate migrationInfo as well
+ $migrationInfo = $migrationData['migration_info'];
+ $migrationInfo['skip_merge'] = CRM_Utils_Array::value('skip_merge', $migrationData);
+ return $conflicts;
+ }
+
+ /**
+ * Do file custom fields related migrations.
+ * FIXME: move this someplace else (one of the BAOs) after discussing
+ * where to, and whether CRM_Core_BAO_File::deleteFileReferences() shouldn't actually,
+ * like, delete a file...
+ *
+ * Note outstanding bug https://lab.civicrm.org/dev/core/issues/723
+ * relates to this code....
+ *
+ * @param $mainId
+ * @param $otherId
+ * @param $customFiles
+ */
+ protected static function processCustomFieldFiles($mainId, $otherId, $customFiles) {
+ foreach ($customFiles as $customId) {
+ list($tableName, $columnName, $groupID) = CRM_Core_BAO_CustomField::getTableColumnGroup($customId);
+
+ // get the contact_id -> file_id mapping
+ $fileIds = [];
+ $sql = "SELECT entity_id, {$columnName} AS file_id FROM {$tableName} WHERE entity_id IN ({$mainId}, {$otherId})";
+ $dao = CRM_Core_DAO::executeQuery($sql);
+ while ($dao->fetch()) {
+ // @todo - this is actually broken - fix & or remove - see testMergeCustomFields
+ $fileIds[$dao->entity_id] = $dao->file_id;
+ if ($dao->entity_id == $mainId) {
+ CRM_Core_BAO_File::deleteFileReferences($fileIds[$mainId], $mainId, $customId);
+ }
+ }
+
+ // move the other contact's file to main contact
+ //NYSS need to INSERT or UPDATE depending on whether main contact has an existing record
+ if (CRM_Core_DAO::singleValueQuery("SELECT id FROM {$tableName} WHERE entity_id = {$mainId}")) {
+ $sql = "UPDATE {$tableName} SET {$columnName} = {$fileIds[$otherId]} WHERE entity_id = {$mainId}";
+ }
+ else {
+ $sql = "INSERT INTO {$tableName} ( entity_id, {$columnName} ) VALUES ( {$mainId}, {$fileIds[$otherId]} )";
+ }
+ CRM_Core_DAO::executeQuery($sql);
+
+ if (CRM_Core_DAO::singleValueQuery("
+ SELECT id
+ FROM civicrm_entity_file
+ WHERE entity_table = '{$tableName}' AND file_id = {$fileIds[$otherId]}")
+ ) {
+ $sql = "
+ UPDATE civicrm_entity_file
+ SET entity_id = {$mainId}
+ WHERE entity_table = '{$tableName}' AND file_id = {$fileIds[$otherId]}";
+ }
+ else {
+ $sql = "
+ INSERT INTO civicrm_entity_file ( entity_table, entity_id, file_id )
+ VALUES ( '{$tableName}', {$mainId}, {$fileIds[$otherId]} )";
+ }
+ CRM_Core_DAO::executeQuery($sql);
}
}
*
* @return array
* Array of event summary values
+ *
+ * @throws \CiviCRM_API3_Exception
*/
public static function getEventSummary() {
$eventSummary = $eventIds = [];
// get permission and include them here
// does not scale, but rearranging code for now
// FIXME in a future release
- $permissions = CRM_Event_BAO_Event::checkPermission();
+ $permissions = self::getAllPermissions();
$validEventIDs = '';
if (empty($permissions[CRM_Core_Permission::VIEW])) {
$eventSummary['total_events'] = 0;
['entity_value' => $id, 'mapping_id' => $oldMapping->getId()],
['entity_value' => $copyEvent->id, 'mapping_id' => $copyMapping->getId()]
);
- self::copyCustomFields($id, $copyEvent->id);
$copyEvent->save();
return $copyEvent;
}
- /**
- * Method that copies custom fields values from an old event to a new one. Fixes bug CRM-19302,
- * where if a custom field of File type was present, left both events using the same file,
- * breaking download URL's for the old event.
- *
- * @param int $oldEventID
- * @param int $newCopyID
- */
- public static function copyCustomFields($oldEventID, $newCopyID) {
- // Obtain custom values for old event
- $customParams = $htmlType = [];
- $customValues = CRM_Core_BAO_CustomValueTable::getEntityValues($oldEventID, 'Event');
-
- // If custom values present, we copy them
- if (!empty($customValues)) {
- // Get Field ID's and identify File type attributes, to handle file copying.
- $fieldIds = implode(', ', array_keys($customValues));
- $sql = "SELECT id FROM civicrm_custom_field WHERE html_type = 'File' AND id IN ( {$fieldIds} )";
- $result = CRM_Core_DAO::executeQuery($sql);
-
- // Build array of File type fields
- while ($result->fetch()) {
- $htmlType[] = $result->id;
- }
-
- // Build params array of custom values
- foreach ($customValues as $field => $value) {
- if ($value !== NULL) {
- // Handle File type attributes
- if (in_array($field, $htmlType)) {
- $fileValues = CRM_Core_BAO_File::path($value, $oldEventID);
- $customParams["custom_{$field}_-1"] = [
- 'name' => CRM_Utils_File::duplicate($fileValues[0]),
- 'type' => $fileValues[1],
- ];
- }
- // Handle other types
- else {
- $customParams["custom_{$field}_-1"] = $value;
- }
- }
- }
-
- // Save Custom Fields for new Event
- CRM_Core_BAO_CustomValueTable::postProcess($customParams, 'civicrm_event', $newCopyID, 'Event');
- }
-
- // copy activity attachments ( if any )
- CRM_Core_BAO_File::copyEntityFile('civicrm_event', $oldEventID, 'civicrm_event', $newCopyID);
- }
-
/**
* This is sometimes called in a loop (during event search).
*
*
* Generated from xml/schema/CRM/Event/Cart/Cart.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:480e2fc6225765f7ff4930376c1ed70f)
+ * (GenCodeChecksum:71454cbda07a2fefd75041815b95ed0c)
*/
/**
/**
* Cart Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_contact who created this cart
*
- * @var int unsigned
+ * @var int
*/
public $user_id;
/**
- * @var boolean
+ * @var bool
*/
public $completed;
*
* Generated from xml/schema/CRM/Event/Cart/EventInCart.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0f1e8db14667dfe6351ce2610d4431bd)
+ * (GenCodeChecksum:b9da5d3acb0b71b79cc3f8d2f7e5ec50)
*/
/**
/**
* Event In Cart Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Event ID
*
- * @var int unsigned
+ * @var int
*/
public $event_id;
/**
* FK to Event Cart ID
*
- * @var int unsigned
+ * @var int
*/
public $event_cart_id;
}
}
+ // Validate if participant is already registered
+ if ($event_in_cart->event->allow_same_participant_emails) {
+ continue;
+ }
+
foreach ($event_in_cart->participants as $mer_participant) {
$participant_fields = $fields['event'][$event_in_cart->event_id]['participant'][$mer_participant->id];
//TODO what to do when profile responses differ for the same contact?
);
$this->assign('pay_later_instructions', $this->pay_later_receipt);
}
+
+ // Event Cart does not support multiple payment processors
+ // so we cannot call $this->preProcessPaymentOptions();
+ CRM_Financial_Form_Payment::addCreditCardJs($this->_paymentProcessor['id']);
}
/**
$send_template_params = [
'table' => 'civicrm_msg_template',
'contactId' => $this->payer_contact_id,
- 'from' => CRM_Core_BAO_Domain::getNameAndEmail(TRUE, TRUE),
+ 'from' => current(CRM_Core_BAO_Domain::getNameAndEmail(TRUE, TRUE)),
'groupName' => 'msg_tpl_workflow_event',
'isTest' => FALSE,
'toEmail' => $contact_details[1],
$ctype,
TRUE
);
+
+ $params['contact_id'] = $this->payer_contact_id;
}
$params['now'] = date('YmdHis');
*
* Generated from xml/schema/CRM/Event/Event.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:950e07f412225a94ad11a8220a8f2f19)
+ * (GenCodeChecksum:887208d4102061a0f26eda2a6f84ea09)
*/
/**
/**
* Event
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Event Type ID.Implicit FK to civicrm_option_value where option_group = event_type.
*
- * @var int unsigned
+ * @var int
*/
public $event_type_id;
/**
* Should we expose the participant list? Implicit FK to civicrm_option_value where option_group = participant_listing.
*
- * @var int unsigned
+ * @var int
*/
public $participant_listing_id;
/**
* Public events will be included in the iCal feeds. Access to private event information may be limited using ACLs.
*
- * @var boolean
+ * @var bool
*/
public $is_public;
/**
* If true, include registration link on Event Info page.
*
- * @var boolean
+ * @var bool
*/
public $is_online_registration;
/**
* Maximum number of registered participants to allow. After max is reached, a custom Event Full message is displayed. If NULL, allow unlimited number of participants.
*
- * @var int unsigned
+ * @var int
*/
public $max_participants;
/**
* If true, one or more fee amounts must be set and a Payment Processor must be configured for Online Event Registration.
*
- * @var boolean
+ * @var bool
*/
public $is_monetary;
/**
* Financial type assigned to paid event registrations for this event. Required if is_monetary is true.
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* Include a map block on the Event Information page when geocode info is available and a mapping provider has been specified?
*
- * @var boolean
+ * @var bool
*/
public $is_map;
/**
* Is this Event enabled or disabled/cancelled?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* If true, show event location.
*
- * @var boolean
+ * @var bool
*/
public $is_show_location;
/**
* FK to Location Block ID
*
- * @var int unsigned
+ * @var int
*/
public $loc_block_id;
/**
* Participant role ID. Implicit FK to civicrm_option_value where option_group = participant_role.
*
- * @var int unsigned
+ * @var int
*/
public $default_role_id;
/**
* If true, confirmation is automatically emailed to contact on successful registration.
*
- * @var boolean
+ * @var bool
*/
public $is_email_confirm;
/**
* FK to civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $default_fee_id;
/**
* FK to civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $default_discount_fee_id;
/**
* if true - allows the user to send payment directly to the org later
*
- * @var boolean
+ * @var bool
*/
public $is_pay_later;
/**
* is partial payment enabled for this event
*
- * @var boolean
+ * @var bool
*/
public $is_partial_payment;
/**
* if true - allows the user to register multiple participants for event
*
- * @var boolean
+ * @var bool
*/
public $is_multiple_registrations;
/**
* Maximum number of additional participants that can be registered on a single booking
*
- * @var int unsigned
+ * @var int
*/
public $max_additional_participants;
/**
* if true - allows the user to register multiple registrations from same email address.
*
- * @var boolean
+ * @var bool
*/
public $allow_same_participant_emails;
/**
* Whether the event has waitlist support.
*
- * @var boolean
+ * @var bool
*/
public $has_waitlist;
/**
* Whether participants require approval before they can finish registering.
*
- * @var boolean
+ * @var bool
*/
public $requires_approval;
/**
* Expire pending but unconfirmed registrations after this many hours.
*
- * @var int unsigned
+ * @var int
*/
public $expiration_time;
/**
* Allow self service cancellation or transfer for event?
*
- * @var boolean
+ * @var bool
*/
public $allow_selfcancelxfer;
/**
* Number of hours prior to event start date to allow self-service cancellation or transfer.
*
- * @var int unsigned
+ * @var int
*/
public $selfcancelxfer_time;
/**
* whether the event has template
*
- * @var boolean
+ * @var bool
*/
public $is_template;
/**
* FK to civicrm_contact, who created this event
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* The campaign for which this event has been created.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* Can people share the event through social media?
*
- * @var boolean
+ * @var bool
*/
public $is_share;
/**
* If false, the event booking confirmation screen gets skipped
*
- * @var boolean
+ * @var bool
*/
public $is_confirm_enabled;
/**
* Implicit FK to civicrm_event: parent event
*
- * @var int unsigned
+ * @var int
*/
public $parent_event_id;
/**
* Subevent slot label. Implicit FK to civicrm_option_value where option_group = conference_slot.
*
- * @var int unsigned
+ * @var int
*/
public $slot_label_id;
/**
* Rule to use when matching registrations for this event
*
- * @var int unsigned
+ * @var int
*/
public $dedupe_rule_group_id;
/**
* if true than billing block is required this event
*
- * @var boolean
+ * @var bool
*/
public $is_billing_required;
'pseudoconstant' => [
'optionGroupName' => 'event_type',
'optionEditPath' => 'civicrm/admin/options/event_type',
- ]
+ ],
],
'participant_listing_id' => [
'name' => 'participant_listing_id',
'pseudoconstant' => [
'optionGroupName' => 'participant_listing',
'optionEditPath' => 'civicrm/admin/options/participant_listing',
- ]
+ ],
],
'is_public' => [
'name' => 'is_public',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'payment_processor' => [
'name' => 'payment_processor',
'table' => 'civicrm_payment_processor',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'is_map' => [
'name' => 'is_map',
'pseudoconstant' => [
'optionGroupName' => 'participant_role',
'optionEditPath' => 'civicrm/admin/options/participant_role',
- ]
+ ],
],
'intro_text' => [
'name' => 'intro_text',
'description' => ts('Minimum initial amount for partial payment'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_event.min_initial_amount',
'table_name' => 'civicrm_event',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'campaign_id' => [
'name' => 'campaign_id',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'is_share' => [
'name' => 'is_share',
'keyColumn' => 'id',
'labelColumn' => 'title',
'nameColumn' => 'name',
- ]
+ ],
],
'is_billing_required' => [
'name' => 'is_billing_required',
*
* Generated from xml/schema/CRM/Event/Participant.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:07eafc5db4afa9fe7ca200110727d42f)
+ * (GenCodeChecksum:2c9fa9a933df6d5c4ec745b8031f9297)
*/
/**
/**
* Participant Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to Event ID
*
- * @var int unsigned
+ * @var int
*/
public $event_id;
/**
* Participant status ID. FK to civicrm_participant_status_type. Default of 1 should map to status = Registered.
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* Populate with the label (text) associated with a fee level for paid events with multiple levels. Note that
- we store the label value and not the key
+ * we store the label value and not the key
*
* @var text
*/
public $fee_level;
/**
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
- * @var boolean
+ * @var bool
*/
public $is_pay_later;
/**
* FK to Participant ID
*
- * @var int unsigned
+ * @var int
*/
public $registered_by_id;
/**
* FK to Discount ID
*
- * @var int unsigned
+ * @var int
*/
public $discount_id;
/**
* The campaign for which this participant has been registered.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* Discount Amount
*
- * @var int unsigned
+ * @var int
*/
public $discount_amount;
/**
* FK to civicrm_event_carts
*
- * @var int unsigned
+ * @var int
*/
public $cart_id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $transferred_to_contact_id;
'table' => 'civicrm_participant_status_type',
'keyColumn' => 'id',
'labelColumn' => 'label',
- ]
+ ],
],
'participant_role_id' => [
'name' => 'role_id',
'pseudoconstant' => [
'optionGroupName' => 'participant_role',
'optionEditPath' => 'civicrm/admin/options/participant_role',
- ]
+ ],
],
'participant_register_date' => [
'name' => 'register_date',
'type' => CRM_Utils_Type::T_TEXT,
'title' => ts('Fee level'),
'description' => ts('Populate with the label (text) associated with a fee level for paid events with multiple levels. Note that
- we store the label value and not the key
- '),
+ we store the label value and not the key'),
'import' => TRUE,
'where' => 'civicrm_participant.fee_level',
'headerPattern' => '/^(f(ee\s)?level)$/i',
'description' => ts('actual processor fee if known - may be 0.'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_participant.fee_amount',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'participant_campaign_id' => [
'name' => 'campaign_id',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'discount_amount' => [
'name' => 'discount_amount',
*
* Generated from xml/schema/CRM/Event/ParticipantPayment.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:33976e80c23c2f9eeaa844c812004b42)
+ * (GenCodeChecksum:26f5438e86ca3500888b49650bc6d9e8)
*/
/**
/**
* Participant Payment Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Participant Id (FK)
*
- * @var int unsigned
+ * @var int
*/
public $participant_id;
/**
* FK to contribution table.
*
- * @var int unsigned
+ * @var int
*/
public $contribution_id;
*
* Generated from xml/schema/CRM/Event/ParticipantStatusType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8279655ecdaf4a9ca6a0a3a76e945644)
+ * (GenCodeChecksum:a42abc9dbf891aa6cbb6513ca18067b9)
*/
/**
/**
* unique participant status type id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* whether this is a status type required by the system
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* whether this status type is active
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* whether this status type is counted against event size limit
*
- * @var boolean
+ * @var bool
*/
public $is_counted;
/**
* controls sort order
*
- * @var int unsigned
+ * @var int
*/
public $weight;
/**
* whether the status type is visible to the public, an implicit foreign key to option_value.value related to the `visibility` option_group
*
- * @var int unsigned
+ * @var int
*/
public $visibility_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Event_PseudoConstant::participantStatusClassOptions',
- ]
+ ],
],
'is_reserved' => [
'name' => 'is_reserved',
'pseudoconstant' => [
'optionGroupName' => 'visibility',
'optionEditPath' => 'civicrm/admin/options/visibility',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
/**
* Is this the first page?
*
- * @var boolean
+ * @var bool
*/
protected $_first = FALSE;
/**
* Are we in single form mode or wizard mode?
*
- * @var boolean
+ * @var bool
*/
protected $_single;
/**
* Are we actually managing an event template?
- * @var boolean
+ * @var bool
*/
protected $_isTemplate = FALSE;
/**
- * Pre-populate fields based on this template event_id
- * @var integer
+ * Pre-populate fields based on this template event_id.
+ *
+ * @var int
*/
protected $_templateId;
$this->addElement('submit', $this->getButtonName('submit'), ts('Add Discount Set to Fee Table'),
['class' => 'crm-form-submit cancel']
);
- if (CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled')) {
+ if (Civi::settings()->get('deferred_revenue_enabled')) {
$deferredFinancialType = CRM_Financial_BAO_FinancialAccount::getDeferredFinancialType();
$this->assign('deferredFinancialType', array_keys($deferredFinancialType));
}
/**
* The values for the quickconfig for priceset.
*
- * @var boolean
+ * @var bool
*/
public $_quickConfig = NULL;
* Are we operating in "single mode", i.e. adding / editing only
* one participant record, or is this a batch add operation
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
$contributionParams = ['skipCleanMoney' => TRUE];
$lineItem = [];
$additionalParticipantDetails = [];
- if (CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled')) {
+ if (Civi::settings()->get('deferred_revenue_enabled')) {
$eventStartDate = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $this->_eventId, 'start_date');
if (strtotime($eventStartDate) > strtotime(date('Ymt'))) {
$contributionParams['revenue_recognition_date'] = date('Ymd', strtotime($eventStartDate));
/**
* Is participant able to walk registration wizard.
*
- * @var Boolean
+ * @var bool
*/
public $_allowConfirmation;
/**
* Is participant requires approval.
*
- * @var Boolean
+ * @var bool
*/
public $_requireApproval;
/**
* Is event configured for waitlist.
*
- * @var Boolean
+ * @var bool
*/
public $_allowWaitlist;
/**
* Is event already full.
*
- * @var boolean
+ * @var bool
*
*/
);
}
- if (CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled')) {
+ if (Civi::settings()->get('deferred_revenue_enabled')) {
$eventStartDate = CRM_Utils_Array::value(
'start_date',
CRM_Utils_Array::value(
/**
* Show fee block or not.
*
- * @var boolean determines if fee block should be shown or hidden
+ * @var bool
*/
public $_noFees;
/**
- * @var array Fee Block
+ * Fee Block.
+ *
+ * @var array
*/
public $_feeBlock;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
$seatClause[] = "( participant.is_test = {$this->_formValues['participant_test']} )";
}
if (!empty($this->_formValues['participant_status_id'])) {
- $seatClause[] = CRM_Contact_BAO_Query::buildClause("participant.status_id", '=', $this->_formValues['participant_status_id'], 'Int');
+ $seatClause[] = CRM_Contact_BAO_Query::buildClause("participant.status_id", 'IN', $this->_formValues['participant_status_id'], 'Int');
if ($status = CRM_Utils_Array::value('IN', $this->_formValues['participant_status_id'])) {
$this->_formValues['participant_status_id'] = $status;
}
CRM_Contact_BAO_Query::processSpecialFormValue($this->_formValues, ['participant_status_id']);
}
- if (empty($this->_formValues)) {
+ if (empty($formValues)) {
$formValues = $this->controller->exportValues($this->_name);
}
* return @void
*/
public function transferParticipant($params) {
- $isBackOfficeArg = $this->isBackoffice ? '&is_backoffice=1' : '';
CRM_Utils_System::redirect(CRM_Utils_System::url(
'civicrm/event/selfsvctransfer',
[
'action' => 'add',
'pid' => $this->_participant_id,
'cs' => $this->_userChecksum,
+ 'is_backoffice' => $this->isBackoffice,
]
));
}
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. deleting one
* specific participation?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_noEmails = FALSE;
* Are we operating in "single mode", i.e. printing letter to one
* specific participant?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
protected $_fileName;
/**
- * #@+
- * @var integer
- */
-
- /**
- * Imported file size
+ * Imported file size.
+ *
* @var int
*/
protected $_fileSize;
/**
- * Seperator being used
+ * Separator being used.
+ *
* @var string
*/
protected $_seperator;
/**
- * Total number of lines in file
+ * Total number of lines in file.
+ *
* @var int
*/
protected $_lineCount;
/**
* Whether the file has a column header or not
*
- * @var boolean
+ * @var bool
*/
protected $_haveColumnHeader;
$this->_searchResult = CRM_Utils_Request::retrieve('searchResult', 'Boolean', $this);
$whereClause = $this->whereClause($params, FALSE, $this->_force);
- $this->pagerAToZ($whereClause, $params);
+
+ if (CRM_Core_Config::singleton()->includeAlphabeticalPager) {
+ $this->pagerAToZ($whereClause, $params);
+ }
$params = [];
$whereClause = $this->whereClause($params, TRUE, $this->_force);
if (is_array($value)) {
$type = implode(',', $value);
}
- $clauses[] = "event_type_id IN ({$type})";
+ $clauses[] = "event_type_id IN (%2)";
+ $params[2] = [$type, 'String'];
}
$eventsByDates = $this->get('eventsByDates');
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
*/
public static function createTempTable($sqlColumns) {
//creating a temporary table for the search result that need be exported
- $exportTempTable = CRM_Utils_SQL_TempTable::build()->setDurable()->setCategory('export')->setUtf8();
+ $exportTempTable = CRM_Utils_SQL_TempTable::build()->setDurable()->setCategory('export');
// also create the sql table
$exportTempTable->drop();
/**
* Download Exported file.
- * @var boolean
+ * @var bool
*/
public $_isDownloadFile;
'currency' => $this->format($itemDAO->currency),
];
} // end items loop
- $itemDAO->free();
}
else {
// In this case, split record just uses the FROM account from the trxn, and there's only one record here
*
*/
public static function checkFinancialTypeHasDeferred($params, $contributionID = NULL, $priceSetFields = NULL) {
- if (!CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled')) {
+ if (!Civi::settings()->get('deferred_revenue_enabled')) {
return FALSE;
}
$recognitionDate = CRM_Utils_Array::value('revenue_recognition_date', $params);
*
* @throws \API_Exception
* @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
*/
public static function create($params) {
$contribution = civicrm_api3('Contribution', 'getsingle', ['id' => $params['contribution_id']]);
// should be handled through Payment.create.
$isSkipRecordingPaymentHereForLegacyHandlingReasons = ($contributionStatus == 'Pending' && $isPaymentCompletesContribution);
- if (!$isSkipRecordingPaymentHereForLegacyHandlingReasons) {
+ if (!$isSkipRecordingPaymentHereForLegacyHandlingReasons && $params['total_amount'] > 0) {
$trxn = CRM_Contribute_BAO_Contribution::recordPartialPayment($contribution, $params);
if (CRM_Utils_Array::value('line_item', $params) && !empty($trxn)) {
CRM_Contribute_BAO_Contribution::assignProportionalLineItems($params, $trxn->id, $contribution['total_amount']);
}
}
+ elseif ($params['total_amount'] < 0) {
+ $trxn = self::recordRefundPayment($params['contribution_id'], $params, FALSE);
+ }
if ($isPaymentCompletesContribution) {
- civicrm_api3('Contribution', 'completetransaction', ['id' => $contribution['id']]);
- // Get the trxn
- $trxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution['id'], 'DESC');
- $ftParams = ['id' => $trxnId['financialTrxnId']];
- $trxn = CRM_Core_BAO_FinancialTrxn::retrieve($ftParams, CRM_Core_DAO::$_nullArray);
+ if ($contributionStatus == 'Pending refund') {
+ // Ideally we could still call completetransaction as non-payment related actions should
+ // be outside this class. However, for now we just update the contribution here.
+ // Unit test cover in CRM_Event_BAO_AdditionalPaymentTest::testTransactionInfo.
+ civicrm_api3('Contribution', 'create',
+ [
+ 'id' => $contribution['id'],
+ 'contribution_status_id' => 'Completed',
+ ]
+ );
+ }
+ else {
+ civicrm_api3('Contribution', 'completetransaction', ['id' => $contribution['id']]);
+ // Get the trxn
+ $trxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution['id'], 'DESC');
+ $ftParams = ['id' => $trxnId['financialTrxnId']];
+ $trxn = CRM_Core_BAO_FinancialTrxn::retrieve($ftParams, CRM_Core_DAO::$_nullArray);
+ }
}
elseif ($contributionStatus === 'Pending') {
civicrm_api3('Contribution', 'create',
$arAccountId = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($contributionDAO->financial_type_id, 'Accounts Receivable Account is');
$completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
- $trxnData['total_amount'] = $trxnData['net_amount'] = -$trxnData['total_amount'];
+ $trxnData['total_amount'] = $trxnData['net_amount'] = $trxnData['total_amount'];
$trxnData['from_financial_account_id'] = $arAccountId;
$trxnData['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Refunded');
// record the entry
*
* Generated from xml/schema/CRM/Financial/Currency.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:19729d25ea5ad98f3fc2551acab9fa7a)
+ * (GenCodeChecksum:5490d115dbd495ebb39ce46a4149cbc2)
*/
/**
/**
* Currency Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
*
* Generated from xml/schema/CRM/Financial/EntityFinancialAccount.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f0a99b56fe094d649cc56eb930b4ae23)
+ * (GenCodeChecksum:3e195b6b8f9a99b338219723c2b509a7)
*/
/**
/**
* ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Links to an id in the entity_table, such as vid in civicrm_financial_type
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to a new civicrm_option_value (account_relationship)
*
- * @var int unsigned
+ * @var int
*/
public $account_relationship;
/**
* FK to the financial_account_id
*
- * @var int unsigned
+ * @var int
*/
public $financial_account_id;
'pseudoconstant' => [
'optionGroupName' => 'account_relationship',
'optionEditPath' => 'civicrm/admin/options/account_relationship',
- ]
+ ],
],
'financial_account_id' => [
'name' => 'financial_account_id',
'table' => 'civicrm_financial_account',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Financial/EntityFinancialTrxn.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b7687297d632a4658b6686a5b540f974)
+ * (GenCodeChecksum:14582d82c08fe5e2c4242e4bafc146d4)
*/
/**
/**
* ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
public $entity_table;
/**
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
- * @var int unsigned
+ * @var int
*/
public $financial_trxn_id;
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_entity_financial_trxn.amount',
*
* Generated from xml/schema/CRM/Financial/FinancialAccount.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:99e6943d33c4b4081a8d74e611589dd7)
+ * (GenCodeChecksum:be1c13919aa1ff84b28ef61832132842)
*/
/**
/**
* ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID that is responsible for the funds in this account
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* pseudo FK into civicrm_option_value.
*
- * @var int unsigned
+ * @var int
*/
public $financial_account_type_id;
/**
* Parent ID in account hierarchy
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
/**
* Is this a header account which does not allow transactions to be posted against it directly, but only to its sub-accounts?
*
- * @var boolean
+ * @var bool
*/
public $is_header_account;
/**
* Is this account tax-deductible?
*
- * @var boolean
+ * @var bool
*/
public $is_deductible;
/**
* Is this account for taxes?
*
- * @var boolean
+ * @var bool
*/
public $is_tax;
/**
* Is this a predefined system object?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this account the default one (or default tax one) for its financial_account_type?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
'pseudoconstant' => [
'optionGroupName' => 'financial_account_type',
'optionEditPath' => 'civicrm/admin/options/financial_account_type',
- ]
+ ],
],
'accounting_code' => [
'name' => 'accounting_code',
'description' => ts('The percentage of the total_amount that is due for this tax.'),
'precision' => [
10,
- 8
+ 8,
],
'where' => 'civicrm_financial_account.tax_rate',
'table_name' => 'civicrm_financial_account',
*
* Generated from xml/schema/CRM/Financial/FinancialItem.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8ebea76ed5ae2b3e7fe0ddafa55a4aed)
+ * (GenCodeChecksum:49a455dafedd73005f06e17dcc99c365)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID of contact the item is from
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to civicrm_financial_account
*
- * @var int unsigned
+ * @var int
*/
public $financial_account_id;
/**
* Payment status: test, paid, part_paid, unpaid (if empty assume unpaid)
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* The specific source item that is responsible for the creation of this financial_item
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_financial_item.amount',
'headerPattern' => '/unit?.?amoun/i',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'financial_account_id' => [
'name' => 'financial_account_id',
'table' => 'civicrm_financial_account',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'status_id' => [
'name' => 'status_id',
'pseudoconstant' => [
'optionGroupName' => 'financial_item_status',
'optionEditPath' => 'civicrm/admin/options/financial_item_status',
- ]
+ ],
],
'entity_table' => [
'name' => 'entity_table',
*
* Generated from xml/schema/CRM/Financial/FinancialTrxn.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:d30cfdb7f54eac46852246cf30654a97)
+ * (GenCodeChecksum:e130935b88e96b99dc58cb9003666e18)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to financial_account table.
*
- * @var int unsigned
+ * @var int
*/
public $from_financial_account_id;
/**
* FK to financial_financial_account table.
*
- * @var int unsigned
+ * @var int
*/
public $to_financial_account_id;
/**
* Is this entry either a payment or a reversal of a payment?
*
- * @var boolean
+ * @var bool
*/
public $is_payment;
/**
* pseudo FK to civicrm_option_value of contribution_status_id option_group
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* Payment Processor for this financial transaction
*
- * @var int unsigned
+ * @var int
*/
public $payment_processor_id;
/**
* FK to payment_instrument option group values
*
- * @var int unsigned
+ * @var int
*/
public $payment_instrument_id;
/**
* FK to accept_creditcard option group values
*
- * @var int unsigned
+ * @var int
*/
public $card_type_id;
'table' => 'civicrm_financial_account',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'to_financial_account_id' => [
'name' => 'to_financial_account_id',
'table' => 'civicrm_financial_account',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'trxn_date' => [
'name' => 'trxn_date',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_financial_trxn.total_amount',
'table_name' => 'civicrm_financial_trxn',
'description' => ts('actual processor fee if known - may be 0.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_financial_trxn.fee_amount',
'table_name' => 'civicrm_financial_trxn',
'description' => ts('actual funds transfer amount. total less fees. if processor does not report actual fee during transaction, this is set to total_amount.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_financial_trxn.net_amount',
'table_name' => 'civicrm_financial_trxn',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'is_payment' => [
'name' => 'is_payment',
'pseudoconstant' => [
'optionGroupName' => 'contribution_status',
'optionEditPath' => 'civicrm/admin/options/contribution_status',
- ]
+ ],
],
'payment_processor_id' => [
'name' => 'payment_processor_id',
'pseudoconstant' => [
'optionGroupName' => 'payment_instrument',
'optionEditPath' => 'civicrm/admin/options/payment_instrument',
- ]
+ ],
],
'financial_trxn_card_type_id' => [
'name' => 'card_type_id',
'pseudoconstant' => [
'optionGroupName' => 'accept_creditcard',
'optionEditPath' => 'civicrm/admin/options/accept_creditcard',
- ]
+ ],
],
'financial_trxn_check_number' => [
'name' => 'check_number',
*
* Generated from xml/schema/CRM/Financial/FinancialType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:760550280aaa0da48232ebdfb11170f9)
+ * (GenCodeChecksum:9395c8fe3d749ad60136065301a5c44f)
*/
/**
/**
* ID of original financial_type so you can search this table by the financial_type.id and then select the relevant version based on the timestamp
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this financial type tax-deductible? If true, contributions of this type may be fully OR partially deductible - non-deductible amount is stored in the Contribution record.
*
- * @var boolean
+ * @var bool
*/
public $is_deductible;
/**
* Is this a predefined system object?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
*
* Generated from xml/schema/CRM/Financial/PaymentProcessor.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:83f0467b531d70e84945e9c55a8824b6)
+ * (GenCodeChecksum:2d3189beedf083b35929eded03907d9f)
*/
/**
/**
* Payment Processor ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this match entry for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
public $description;
/**
- * @var int unsigned
+ * @var int
*/
public $payment_processor_type_id;
/**
* Is this processor active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this processor the default?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* Is this processor for a test site?
*
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
* Billing Mode (deprecated)
*
- * @var int unsigned
+ * @var int
*/
public $billing_mode;
/**
* Can process recurring contributions
*
- * @var boolean
+ * @var bool
*/
public $is_recur;
/**
* Payment Type: Credit or Debit (deprecated)
*
- * @var int unsigned
+ * @var int
*/
public $payment_type;
/**
* Payment Instrument ID
*
- * @var int unsigned
+ * @var int
*/
public $payment_instrument_id;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'name' => [
'name' => 'name',
'table' => 'civicrm_payment_processor_type',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'is_active' => [
'name' => 'is_active',
'pseudoconstant' => [
'optionGroupName' => 'payment_instrument',
'optionEditPath' => 'civicrm/admin/options/payment_instrument',
- ]
+ ],
],
'accepted_credit_cards' => [
'name' => 'accepted_credit_cards',
*
* Generated from xml/schema/CRM/Financial/PaymentProcessorType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b8290611e8abcbd771b1006fd34e3ec5)
+ * (GenCodeChecksum:f412f0beac8a6387450f8fe19279d0ce)
*/
/**
/**
* Payment Processor Type ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this processor active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this processor the default?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* Billing Mode (deprecated)
*
- * @var int unsigned
+ * @var int
*/
public $billing_mode;
/**
* Can process recurring contributions
*
- * @var boolean
+ * @var bool
*/
public $is_recur;
/**
* Payment Type: Credit or Debit (deprecated)
*
- * @var int unsigned
+ * @var int
*/
public $payment_type;
/**
* Payment Instrument ID
*
- * @var int unsigned
+ * @var int
*/
public $payment_instrument_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::billingMode',
- ]
+ ],
],
'is_recur' => [
'name' => 'is_recur',
'pseudoconstant' => [
'optionGroupName' => 'payment_instrument',
'optionEditPath' => 'civicrm/admin/options/payment_instrument',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Financial/PaymentToken.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:13e09ccc4d4ae2dade53c251d4345ed2)
+ * (GenCodeChecksum:9ef72f3d1fba1b5b89841d36382c3eb6)
*/
/**
/**
* Payment Token ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID for the owner of the token
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
- * @var int unsigned
+ * @var int
*/
public $payment_processor_id;
/**
* Contact ID of token creator
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* Flag if its a AR account type.
*
- * @var boolean
+ * @var bool
*/
protected $_isARFlag = FALSE;
/**
* Flag if its a AR account type.
*
- * @var boolean
+ * @var bool
*/
protected $_isARFlag = FALSE;
public $isBackOffice = FALSE;
/**
- * @var String
+ * @var string
*/
public $_formName = '';
CRM_Core_Payment_ProcessorForm::preProcess($this);
- self::addCreditCardJs($this->_paymentProcessorID);
-
- $this->assign('paymentProcessorID', $this->_paymentProcessorID);
- $this->assign('currency', $this->currency);
-
$this->assign('suppressForm', TRUE);
$this->controller->_generateQFKey = FALSE;
}
*
* Generated from xml/schema/CRM/Friend/Friend.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a0a82714195ed8bafcbb12ef6c829521)
+ * (GenCodeChecksum:a662628e986758095dcbfa2e56597acb)
*/
/**
/**
* Friend ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to the referenced item.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
public $thankyou_text;
/**
- * @var boolean
+ * @var bool
*/
public $is_active;
}
/**
- * Get the metadata for fields to be included on the activity search form.
+ * Get the metadata for fields to be included on the grant search form.
*/
public static function getSearchFieldMetadata() {
$fields = [
*
* Generated from xml/schema/CRM/Grant/Grant.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ea60d8cd875ca924d3cc34b4282c8a8a)
+ * (GenCodeChecksum:46934eeb5b7cc864460135cbbf1679ca)
*/
/**
/**
* Unique Grant id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Contact ID of contact record given grant belongs to.
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* Yes/No field stating whether grant report was received by donor.
*
- * @var boolean
+ * @var bool
*/
public $grant_report_received;
/**
* Type of grant. Implicit FK to civicrm_option_value in grant_type option_group.
*
- * @var int unsigned
+ * @var int
*/
public $grant_type_id;
/**
* Id of Grant status.
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* FK to Financial Type.
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
'pseudoconstant' => [
'optionGroupName' => 'grant_type',
'optionEditPath' => 'civicrm/admin/options/grant_type',
- ]
+ ],
],
'amount_total' => [
'name' => 'amount_total',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_grant.amount_total',
'description' => ts('Requested grant amount, in original currency (optional).'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_grant.amount_requested',
'dataPattern' => '/^\d+(\.\d{2})?$/',
'description' => ts('Granted amount, in default currency.'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_grant.amount_granted',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'rationale' => [
'name' => 'rationale',
'pseudoconstant' => [
'optionGroupName' => 'grant_status',
'optionEditPath' => 'civicrm/admin/options/grant_status',
- ]
+ ],
],
'financial_type_id' => [
'name' => 'financial_type_id',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
* Are we operating in "single mode", i.e. deleting one
* specific participation?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
*/
class CRM_Group_Form_Edit extends CRM_Core_Form {
+ use CRM_Core_Form_EntityFormTrait;
+
/**
* The group id, used when editing a group
*
*/
protected $_groupOrganizationID;
+ /**
+ * Set entity fields to be assigned to the form.
+ */
+ protected function setEntityFields() {
+ $this->entityFields = [
+ 'title' => [
+ 'name' => 'title',
+ 'required' => TRUE,
+ ],
+ 'description' => ['name' => 'description'],
+ ];
+ }
+
+ /**
+ * Set the delete message.
+ *
+ * We do this from the constructor in order to do a translation.
+ */
+ public function setDeleteMessage() {
+ $this->deleteMessage = '';
+ }
+
+ /**
+ * Explicitly declare the entity api name.
+ */
+ public function getDefaultEntity() {
+ return 'Group';
+ }
+
/**
* Set up variables to build the form.
*/
* Build the form object.
*/
public function buildQuickForm() {
- if ($this->_action == CRM_Core_Action::DELETE) {
- $this->addButtons(array(
- array(
- 'type' => 'next',
- 'name' => ts('Delete Group'),
- 'isDefault' => TRUE,
- ),
- array(
- 'type' => 'cancel',
- 'name' => ts('Cancel'),
- ),
- ));
+ self::buildQuickEntityForm();
+ if ($this->_action & CRM_Core_Action::DELETE) {
return;
}
$this->preventAjaxSubmit();
}
- $this->applyFilter('__ALL__', 'trim');
- $this->add('text', 'title', ts('Name') . ' ',
- CRM_Core_DAO::getAttribute('CRM_Contact_DAO_Group', 'title'), TRUE
- );
-
- $this->add('textarea', 'description', ts('Description') . ' ',
- CRM_Core_DAO::getAttribute('CRM_Contact_DAO_Group', 'description')
- );
-
$groupTypes = CRM_Core_OptionGroup::values('group_type', TRUE);
if (isset($this->_id) && !empty($this->_groupValues['saved_search_id'])) {
//build custom data
CRM_Custom_Form_CustomData::buildQuickForm($this);
- $this->addButtons(array(
- array(
- 'type' => 'upload',
- 'name' => ($this->_action == CRM_Core_Action::ADD) ? ts('Continue') : ts('Save'),
- 'isDefault' => TRUE,
- ),
- array(
- 'type' => 'cancel',
- 'name' => ts('Cancel'),
- ),
- ));
-
$doParentCheck = FALSE;
if (CRM_Core_Permission::isMultisiteEnabled()) {
$doParentCheck = ($this->_id && CRM_Core_BAO_Domain::isDomainGroup($this->_id)) ? FALSE : TRUE;
* @inheritDoc
*/
public function checkActive(\Civi\Token\TokenProcessor $processor) {
- return !empty($processor->context['mailingId']) || !empty($processor->context['mailing']);
+ return !empty($processor->context['mailingId']) || !empty($processor->context['mailing'])
+ || in_array('mailingId', $processor->context['schema']) || in_array('mailing', $processor->context['schema']);
}
/**
// replaceSubscribeInviteTokens().
if (empty($row->context['mailingJobId']) || empty($row->context['mailingActionTarget']['hash'])) {
- throw new \CRM_Core_Exception("Error: Cannot use action tokens unless context defines mailingJobId and mailingActionTarget.");
+ // Strictly speaking, it doesn't make much sense to generate action-tokens when there's no job ID, but traditional CiviMail
+ // does this in v5.6+ for "Preview" functionality. Relaxing this strictness check ensures parity between newer+older styles.
+ // throw new \CRM_Core_Exception("Error: Cannot use action tokens unless context defines mailingJobId and mailingActionTarget.");
}
if ($field === 'eventQueueId') {
$numSlices = count($embed_data);
$url = '';
for ($i = 0; $i < $numSlices; $i++) {
+ $embed_url_data = parse_url($embed_data[$i]);
+ if (!empty($embed_url_data['scheme'])) {
+ $token_a['embed_parts'][$i] = preg_replace("/href=\"(https*:\/\/)/", "href=\"", $token_a['embed_parts'][$i]);
+ }
$url .= "{$token_a['embed_parts'][$i]}{$embed_data[$i]}";
}
if (isset($token_a['embed_parts'][$numSlices])) {
*/
public static function getMailingHash($id) {
$hash = NULL;
- if (Civi::settings()->get('hash_mailing_url')) {
+ if (Civi::settings()->get('hash_mailing_url') && !empty($id)) {
$hash = CRM_Core_DAO::getFieldValue('CRM_Mailing_BAO_Mailing', $id, 'hash', 'id');
}
return $hash;
$config = CRM_Core_Config::singleton();
}
- if (property_exists($mailing, 'language') && $mailing->language && $mailing->language != 'en_US') {
+ if (property_exists($mailing, 'language') && $mailing->language && $mailing->language != CRM_Core_I18n::getLocale()) {
$swapLang = CRM_Utils_AutoClean::swap('global://dbLocale?getter', 'call://i18n/setLocale', $mailing->language);
}
*
* Generated from xml/schema/CRM/Mailing/BouncePattern.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4c704cc977e01082612050ebc367ce1a)
+ * (GenCodeChecksum:767f24673857e91d2b76de45fce55649)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Type of bounce
*
- * @var int unsigned
+ * @var int
*/
public $bounce_type_id;
*
* Generated from xml/schema/CRM/Mailing/BounceType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:317021d6e37d4d4d6fd91e15aaef8f93)
+ * (GenCodeChecksum:32b467be869aa9e4539fe7f0824f96b3)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Number of bounces of this type required before the email address is put on bounce hold
*
- * @var int unsigned
+ * @var int
*/
public $hold_threshold;
*
* Generated from xml/schema/CRM/Mailing/Mailing.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:5a53b90adc8124a3af37701d7a50b822)
+ * (GenCodeChecksum:c6f26fcb49da86f49a4a1ac885070ed6)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which site is this mailing for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* FK to the header component.
*
- * @var int unsigned
+ * @var int
*/
public $header_id;
/**
* FK to the footer component.
*
- * @var int unsigned
+ * @var int
*/
public $footer_id;
/**
* FK to the auto-responder component.
*
- * @var int unsigned
+ * @var int
*/
public $reply_id;
/**
* FK to the unsubscribe component.
*
- * @var int unsigned
+ * @var int
*/
public $unsubscribe_id;
/**
- * @var int unsigned
+ * @var int
*/
public $resubscribe_id;
/**
* FK to the opt-out component.
*
- * @var int unsigned
+ * @var int
*/
public $optout_id;
/**
* Should we track URL click-throughs for this mailing?
*
- * @var boolean
+ * @var bool
*/
public $url_tracking;
/**
* Should we forward replies back to the author?
*
- * @var boolean
+ * @var bool
*/
public $forward_replies;
/**
* Should we enable the auto-responder?
*
- * @var boolean
+ * @var bool
*/
public $auto_responder;
/**
* Should we track when recipients open/read this mailing?
*
- * @var boolean
+ * @var bool
*/
public $open_tracking;
/**
* Has at least one job associated with this mailing finished?
*
- * @var boolean
+ * @var bool
*/
public $is_completed;
/**
* FK to the message template.
*
- * @var int unsigned
+ * @var int
*/
public $msg_template_id;
/**
* Should we overrite VERP address in Reply-To
*
- * @var boolean
+ * @var bool
*/
public $override_verp;
/**
* FK to Contact ID who first created this mailing
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* FK to Contact ID who scheduled this mailing
*
- * @var int unsigned
+ * @var int
*/
public $scheduled_id;
/**
* FK to Contact ID who approved this mailing
*
- * @var int unsigned
+ * @var int
*/
public $approver_id;
/**
* The status of this mailing. Values: none, approved, rejected
*
- * @var int unsigned
+ * @var int
*/
public $approval_status_id;
/**
* Is this mailing archived?
*
- * @var boolean
+ * @var bool
*/
public $is_archived;
/**
* The campaign for which this mailing has been initiated.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
/**
* Remove duplicate emails?
*
- * @var boolean
+ * @var bool
*/
public $dedupe_email;
/**
- * @var int unsigned
+ * @var int
*/
public $sms_provider_id;
/**
* With email_selection_method, determines which email address to use
*
- * @var int unsigned
+ * @var int
*/
public $location_type_id;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'header_id' => [
'name' => 'header_id',
],
'pseudoconstant' => [
'callback' => 'CRM_Mailing_PseudoConstant::mailingTypes',
- ]
+ ],
],
'from_name' => [
'name' => 'from_name',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Mailing_BAO_Mailing::getTemplateTypeNames',
- ]
+ ],
],
'template_options' => [
'name' => 'template_options',
'pseudoconstant' => [
'optionGroupName' => 'mail_approval_status',
'optionEditPath' => 'civicrm/admin/options/mail_approval_status',
- ]
+ ],
],
'approval_note' => [
'name' => 'approval_note',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::groupVisibility',
- ]
+ ],
],
'campaign_id' => [
'name' => 'campaign_id',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'dedupe_email' => [
'name' => 'dedupe_email',
'table' => 'civicrm_location_type',
'keyColumn' => 'id',
'labelColumn' => 'display_name',
- ]
+ ],
],
'email_selection_method' => [
'name' => 'email_selection_method',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::emailSelectMethods',
- ]
+ ],
],
'language' => [
'name' => 'language',
'optionGroupName' => 'languages',
'keyColumn' => 'name',
'optionEditPath' => 'civicrm/admin/options/languages',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Mailing/MailingAB.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:507182363032ab7340b7d1e7383ce1dd)
+ * (GenCodeChecksum:a45895256f23784bb86ae1b4659abbe6)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* The first experimental mailing ("A" condition)
*
- * @var int unsigned
+ * @var int
*/
public $mailing_id_a;
/**
* The second experimental mailing ("B" condition)
*
- * @var int unsigned
+ * @var int
*/
public $mailing_id_b;
/**
* The final, general mailing (derived from A or B)
*
- * @var int unsigned
+ * @var int
*/
public $mailing_id_c;
/**
* Which site is this mailing for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
public $declare_winning_time;
/**
- * @var int unsigned
+ * @var int
*/
public $group_percentage;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Mailing_PseudoConstant::abStatus',
- ]
+ ],
],
'mailing_id_a' => [
'name' => 'mailing_id_a',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Mailing_PseudoConstant::abTestCriteria',
- ]
+ ],
],
'winner_criteria' => [
'name' => 'winner_criteria',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Mailing_PseudoConstant::abWinnerCriteria',
- ]
+ ],
],
'specific_url' => [
'name' => 'specific_url',
*
* Generated from xml/schema/CRM/Mailing/MailingComponent.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:955923daf1ea29949123b9b76bab36da)
+ * (GenCodeChecksum:e3b5498354f50a2badfa4425958511af)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Is this the default component for this component_type?
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* Is this property active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::mailingComponents',
- ]
+ ],
],
'subject' => [
'name' => 'subject',
*
* Generated from xml/schema/CRM/Mailing/MailingGroup.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f39d14e245f10652e2fcea603ebc7610)
+ * (GenCodeChecksum:22f18bdbfea712ba8a6e1f0220ffb016)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* The ID of a previous mailing to include/exclude recipients.
*
- * @var int unsigned
+ * @var int
*/
public $mailing_id;
/**
* Foreign key to the referenced item.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getMailingGroupTypes',
- ]
+ ],
],
'entity_table' => [
'name' => 'entity_table',
'localizable' => 0,
'pseudoconstant' => [
'callback' => 'CRM_Mailing_BAO_Mailing::mailingGroupEntityTables',
- ]
+ ],
],
'entity_id' => [
'name' => 'entity_id',
*
* Generated from xml/schema/CRM/Mailing/MailingJob.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e362d1178fb0ca6293b31660e24ea375)
+ * (GenCodeChecksum:e7dbe1ca234cec93cb54192911b87297)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* The ID of the mailing this Job will send.
*
- * @var int unsigned
+ * @var int
*/
public $mailing_id;
/**
* Is this job for a test mail?
*
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
* Parent job id
*
- * @var int unsigned
+ * @var int
*/
public $parent_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::getMailingJobStatus',
- ]
+ ],
],
'is_test' => [
'name' => 'is_test',
*
* Generated from xml/schema/CRM/Mailing/Recipients.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:321767aa3e7c0ea7aac652b973d9603d)
+ * (GenCodeChecksum:006015b0e117746e7c97d656150badc3)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* The ID of the mailing this Job will send.
*
- * @var int unsigned
+ * @var int
*/
public $mailing_id;
/**
* FK to Contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to Email
*
- * @var int unsigned
+ * @var int
*/
public $email_id;
/**
* FK to Phone
*
- * @var int unsigned
+ * @var int
*/
public $phone_id;
*
* Generated from xml/schema/CRM/Mailing/Spool.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:db7871e2d5313c106f01f1516beaf898)
+ * (GenCodeChecksum:55c696d855ff602c9e097bd9ccff0971)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* The ID of the Job .
*
- * @var int unsigned
+ * @var int
*/
public $job_id;
*
* Generated from xml/schema/CRM/Mailing/TrackableURL.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e0280e1322178bb6d56a8104589c1415)
+ * (GenCodeChecksum:36f444ad863c1eae8db4e8e1c768eb27)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to the mailing
*
- * @var int unsigned
+ * @var int
*/
public $mailing_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Bounce.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:5243c65d5b727e60e1fdedb9fa3e84e2)
+ * (GenCodeChecksum:0b39ada8498cdc95e5eab7a4f060686a)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to EventQueue
*
- * @var int unsigned
+ * @var int
*/
public $event_queue_id;
/**
* What type of bounce was it?
*
- * @var int unsigned
+ * @var int
*/
public $bounce_type_id;
'table' => 'civicrm_mailing_bounce_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'bounce_reason' => [
'name' => 'bounce_reason',
*
* Generated from xml/schema/CRM/Mailing/Event/Confirm.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:627a4d86b1b115a52592e04270eadc78)
+ * (GenCodeChecksum:dd5f6d9d5ca3115b92e9f87a1d5bf503)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_mailing_event_subscribe
*
- * @var int unsigned
+ * @var int
*/
public $event_subscribe_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Delivered.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0bdd626b315c4ad541239662d6c52a82)
+ * (GenCodeChecksum:6327ad9e20e94a06bd9609fd3f56a3b4)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to EventQueue
*
- * @var int unsigned
+ * @var int
*/
public $event_queue_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Forward.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:73d4b00ff9ea00d604d5e83963ba5597)
+ * (GenCodeChecksum:b178f318b31d833f478b236f268cbcec)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to EventQueue
*
- * @var int unsigned
+ * @var int
*/
public $event_queue_id;
/**
* FK to EventQueue for destination
*
- * @var int unsigned
+ * @var int
*/
public $dest_queue_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Opened.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:226ec9ccc51c88320e1b4108d5a85bf3)
+ * (GenCodeChecksum:77cca50f0bb75aecfc26f8e62037b93d)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to EventQueue
*
- * @var int unsigned
+ * @var int
*/
public $event_queue_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Queue.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2b873b4e3dae5279b8b63b6e4de5adc0)
+ * (GenCodeChecksum:6ce46b44932d8dcdbf39af7d91a57a03)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Job
*
- * @var int unsigned
+ * @var int
*/
public $job_id;
/**
* FK to Email
*
- * @var int unsigned
+ * @var int
*/
public $email_id;
/**
* FK to Contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to Phone
*
- * @var int unsigned
+ * @var int
*/
public $phone_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Reply.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:651380df4cde36fdfc999b5570cac1f9)
+ * (GenCodeChecksum:0ddff564744f8da4c3d5030ceb692b9c)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to EventQueue
*
- * @var int unsigned
+ * @var int
*/
public $event_queue_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Subscribe.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a18362fb8ab1b7cd9b6f5450fcf367f5)
+ * (GenCodeChecksum:3f9398df2e81f38e0a24330928f85b47)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Group
*
- * @var int unsigned
+ * @var int
*/
public $group_id;
/**
* FK to Contact
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
'table' => 'civicrm_group',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
'contact_id' => [
'name' => 'contact_id',
*
* Generated from xml/schema/CRM/Mailing/Event/TrackableURLOpen.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1dd0644af19360b30531b6f23dde78c1)
+ * (GenCodeChecksum:ed0344e6d9483abfca366a5ba9735e56)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to EventQueue
*
- * @var int unsigned
+ * @var int
*/
public $event_queue_id;
/**
* FK to TrackableURL
*
- * @var int unsigned
+ * @var int
*/
public $trackable_url_id;
*
* Generated from xml/schema/CRM/Mailing/Event/Unsubscribe.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e2a14fa1a63bd3f7b4e4fb4864a8560e)
+ * (GenCodeChecksum:f3f2e48cc72b5cacff2aad1e146e70f8)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to EventQueue
*
- * @var int unsigned
+ * @var int
*/
public $event_queue_id;
/**
* Unsubscribe at org- or group-level
*
- * @var boolean
+ * @var bool
*/
public $org_unsubscribe;
/**
* Scheduled mailing.
*
- * @var boolean
+ * @var bool
*/
public $_scheduled;
* A page for mailing preview.
*/
class CRM_Mailing_Page_View extends CRM_Core_Page {
+
+ /**
+ * Signal to Flexmailer that this version of the class is usable.
+ *
+ * @var bool
+ */
+ const USES_MAILING_PREVIEW_API = 1;
+
protected $_mailingID;
protected $_mailing;
protected $_contactID;
return NULL;
}
- CRM_Mailing_BAO_Mailing::tokenReplace($this->_mailing);
-
- // get and format attachments
- $attachments = CRM_Core_BAO_File::getEntityFile('civicrm_mailing',
- $this->_mailing->id
- );
-
- // get contact detail and compose if contact id exists
- $returnProperties = $this->_mailing->getReturnProperties();
- if (isset($this->_contactID)) {
- // get details of contact with token value including Custom Field Token Values.CRM-3734
- $params = ['contact_id' => $this->_contactID];
- $details = CRM_Utils_Token::getTokenDetails($params,
- $returnProperties,
- FALSE, TRUE, NULL,
- $this->_mailing->getFlattenedTokens(),
- get_class($this)
- );
- $details = $details[0][$this->_contactID];
- $contactId = $this->_contactID;
- }
- else {
- // get tokens that are not contact specific resolved
- $params = ['contact_id' => 0];
- $details = CRM_Utils_Token::getAnonymousTokenDetails($params,
- $returnProperties,
- TRUE, TRUE, NULL,
- $this->_mailing->getFlattenedTokens(),
- get_class($this)
- );
-
- $details = CRM_Utils_Array::value(0, $details[0]);
- $contactId = 0;
- }
- $mime = $this->_mailing->compose(NULL, NULL, NULL, $contactId,
- $this->_mailing->from_email,
- $this->_mailing->from_email,
- TRUE, $details, $attachments
- );
+ $contactId = isset($this->_contactID) ? $this->_contactID : 0;
+
+ $result = civicrm_api3('Mailing', 'preview', [
+ 'id' => $this->_mailingID,
+ 'contact_id' => $contactId,
+ ]);
+ $mailing = \CRM_Utils_Array::value('values', $result);
$title = NULL;
- if (isset($this->_mailing->body_html) && empty($_GET['text'])) {
+ if (isset($mailing['body_html']) && empty($_GET['text'])) {
$header = 'text/html; charset=utf-8';
- $content = $mime->getHTMLBody();
+ $content = $mailing['body_html'];
if (strpos($content, '<head>') === FALSE && strpos($content, '<title>') === FALSE) {
- $title = '<head><title>' . $this->_mailing->subject . '</title></head>';
+ $title = '<head><title>' . $mailing['subject'] . '</title></head>';
}
}
else {
$header = 'text/plain; charset=utf-8';
- $content = $mime->getTXTBody();
+ $content = $mailing['body_text'];
}
- CRM_Utils_System::setTitle($this->_mailing->subject);
+ CRM_Utils_System::setTitle($mailing['subject']);
if (CRM_Utils_Array::value('snippet', $_GET) === 'json') {
CRM_Core_Page_AJAX::returnJsonResponse($content);
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
* the column headers that need to be displayed
*/
public function &getColumnHeaders($action = NULL, $output = NULL) {
+
if (!isset(self::$_columnHeaders)) {
- self::$_columnHeaders = [
+ $isMultiLingual = CRM_Core_I18n::isMultiLingual();
+ $headers = [
['desc' => ts('Contact Type')],
[
'name' => ts('Name'),
'sort' => 'mailing_name',
'direction' => CRM_Utils_Sort::DONTCARE,
],
- [
+ ];
+
+ // Check to see if languages column should be displayed.
+ if ($isMultiLingual) {
+ $headers[] = [
'name' => ts('Language'),
'sort' => 'language',
'direction' => CRM_Utils_Sort::DONTCARE,
- ],
+ ];
+ }
+ self::$_columnHeaders = array_merge($headers, [
[
'name' => ts('Mailing Subject'),
'sort' => 'mailing_subject',
'direction' => CRM_Utils_Sort::DONTCARE,
],
['desc' => ts('Actions')],
- ];
+ ]);
}
return self::$_columnHeaders;
}
* @inheritDoc
*/
public function checkActive(\Civi\Token\TokenProcessor $processor) {
- return !empty($processor->context['mailingId']) || !empty($processor->context['mailing']);
+ return !empty($processor->context['mailingId']) || !empty($processor->context['mailing'])
+ || in_array('mailingId', $processor->context['schema']) || in_array('mailing', $processor->context['schema']);
}
/**
self::processOverriddenUntilDateMembership($dao1);
}
- $query = $baseQuery . " AND civicrm_membership.is_override IS NULL
+ $query = $baseQuery . " AND (civicrm_membership.is_override = 0 OR civicrm_membership.is_override IS NULL)
AND civicrm_membership.status_id NOT IN (%1, %2, %3, %4)
AND civicrm_membership.owner_membership_id IS NULL ";
$params = array(
*
* Generated from xml/schema/CRM/Member/Membership.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f292ac185330c17ffa8c647359ab07b4)
+ * (GenCodeChecksum:458e89b098dbf4f91369a293406c38ba)
*/
/**
/**
* Membership Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to Membership Type
*
- * @var int unsigned
+ * @var int
*/
public $membership_type_id;
/**
* FK to Membership Status
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* Admin users may set a manual status which overrides the calculated status. When this flag is true, automated status update scripts should NOT modify status for the record.
*
- * @var boolean
+ * @var bool
*/
public $is_override;
/**
* Optional FK to Parent Membership.
*
- * @var int unsigned
+ * @var int
*/
public $owner_membership_id;
public $max_related;
/**
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
- * @var boolean
+ * @var bool
*/
public $is_pay_later;
/**
* Conditional foreign key to civicrm_contribution_recur id. Each membership in connection with a recurring contribution carries a foreign key to the recurring contribution record. This assumes we can track these processor initiated events.
*
- * @var int unsigned
+ * @var int
*/
public $contribution_recur_id;
/**
* The campaign for which this membership is attached.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
'table' => 'civicrm_membership_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'join_date' => [
'name' => 'join_date',
'table' => 'civicrm_membership_status',
'keyColumn' => 'id',
'labelColumn' => 'label',
- ]
+ ],
],
'is_override' => [
'name' => 'is_override',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Member/MembershipBlock.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:00a04451a5cee7da1ae6a4c255f40481)
+ * (GenCodeChecksum:0e7f3965fe1382ec1f850a9489b3f236)
*/
/**
/**
* Membership Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_contribution_page.id
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* Optional foreign key to membership_type
*
- * @var int unsigned
+ * @var int
*/
public $membership_type_default;
/**
* Display minimum membership fee
*
- * @var boolean
+ * @var bool
*/
public $display_min_fee;
/**
* Should membership transactions be processed separately
*
- * @var boolean
+ * @var bool
*/
public $is_separate_payment;
/**
* Is membership sign up optional
*
- * @var boolean
+ * @var bool
*/
public $is_required;
/**
* Is this membership_block enabled
*
- * @var boolean
+ * @var bool
*/
public $is_active;
*
* Generated from xml/schema/CRM/Member/MembershipLog.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2ae50fe99b0c911fbe971e12e2bed7ce)
+ * (GenCodeChecksum:82b26091e0c62f81060ae15de5a4a010)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Membership table
*
- * @var int unsigned
+ * @var int
*/
public $membership_id;
/**
* New status assigned to membership by this action. FK to Membership Status
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* FK to Contact ID of person under whose credentials this data modification was made.
*
- * @var int unsigned
+ * @var int
*/
public $modified_id;
/**
* FK to Membership Type.
*
- * @var int unsigned
+ * @var int
*/
public $membership_type_id;
*
* Generated from xml/schema/CRM/Member/MembershipPayment.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1296687b8bc4acb0b1db07fdd131d7ea)
+ * (GenCodeChecksum:63aaccfeac39fe31a88f69693e8b4302)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Membership table
*
- * @var int unsigned
+ * @var int
*/
public $membership_id;
/**
* FK to contribution table.
*
- * @var int unsigned
+ * @var int
*/
public $contribution_id;
*
* Generated from xml/schema/CRM/Member/MembershipStatus.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:125e59b6c34bc9ea478a12c18a66af01)
+ * (GenCodeChecksum:0cb23348cde6fff261da37c8cb309da1)
*/
/**
/**
* Membership Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Does this status aggregate to current members (e.g. New, Renewed, Grace might all be TRUE... while Unrenewed, Lapsed, Inactive would be FALSE).
*
- * @var boolean
+ * @var bool
*/
public $is_current_member;
/**
* Is this status for admin/manual assignment only.
*
- * @var boolean
+ * @var bool
*/
public $is_admin;
/**
* Assign this status to a membership record if no other status match is found.
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* Is this membership_status enabled.
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this membership_status reserved.
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::eventDate',
- ]
+ ],
],
'start_event_adjust_unit' => [
'name' => 'start_event_adjust_unit',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::unitList',
- ]
+ ],
],
'start_event_adjust_interval' => [
'name' => 'start_event_adjust_interval',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::eventDate',
- ]
+ ],
],
'end_event_adjust_unit' => [
'name' => 'end_event_adjust_unit',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::unitList',
- ]
+ ],
],
'end_event_adjust_interval' => [
'name' => 'end_event_adjust_interval',
*
* Generated from xml/schema/CRM/Member/MembershipType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6652513077f7dc2a13004ef30408a051)
+ * (GenCodeChecksum:371e68c0fca2803c9b273bb25991a060)
*/
/**
/**
* Membership Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this match entry for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Owner organization for this membership type. FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $member_of_contact_id;
/**
* If membership is paid by a contribution - what financial type should be used. FK to civicrm_financial_type.id
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* 0 = No auto-renew option; 1 = Give option, but not required; 2 = Auto-renew required;
*
- * @var boolean
+ * @var bool
*/
public $auto_renew;
/**
* Is this membership_type enabled
*
- * @var boolean
+ * @var bool
*/
public $is_active;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'membership_type' => [
'name' => 'name',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'minimum_fee' => [
'name' => 'minimum_fee',
'description' => ts('Minimum fee for this membership (0 for free/complimentary memberships).'),
'precision' => [
18,
- 9
+ 9,
],
'where' => 'civicrm_membership_type.minimum_fee',
'default' => '0',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::membershipTypeUnitList',
- ]
+ ],
],
'duration_interval' => [
'name' => 'duration_interval',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::periodType',
- ]
+ ],
],
'fixed_period_start_day' => [
'name' => 'fixed_period_start_day',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::memberVisibility',
- ]
+ ],
],
'weight' => [
'name' => 'weight',
],
'pseudoconstant' => [
'callback' => 'CRM_Core_SelectValues::memberAutoRenew',
- ]
+ ],
],
'is_active' => [
'name' => 'is_active',
*
* @throws \Exception
*/
+
+ /**
+ * Set the renewal notification status message.
+ */
+ public function setRenewalMessage() {
+ $statusMsg = ts('%1 membership for %2 has been renewed.', array(1 => $this->membershipTypeName, 2 => $this->_memberDisplayName));
+
+ if ($this->isMailSent) {
+ $statusMsg .= ' ' . ts('A renewal confirmation and receipt has been sent to %1.', array(
+ 1 => $this->_contributorEmail,
+ ));
+ }
+ CRM_Core_Session::setStatus($statusMsg, ts('Complete'), 'success');
+ }
+
public function preProcess() {
// This string makes up part of the class names, differentiating them (not sure why) from the membership fields.
try {
$this->submit();
- $statusMsg = ts('%1 membership for %2 has been renewed.', [1 => $this->membershipTypeName, 2 => $this->_memberDisplayName]);
-
- if ($this->endDate) {
- $statusMsg .= ' ' . ts('The new membership End Date is %1.', [
- 1 => CRM_Utils_Date::customFormat(substr($this->endDate, 0, 8)),
- ]);
- }
-
- if ($this->isMailSent) {
- $statusMsg .= ' ' . ts('A renewal confirmation and receipt has been sent to %1.', [
- 1 => $this->_contributorEmail,
- ]);
- return $statusMsg;
- }
- return $statusMsg;
+ $this->setRenewalMessage();
}
catch (\Civi\Payment\Exception\PaymentProcessorException $e) {
CRM_Core_Session::singleton()->setStatus($e->getMessage());
"reset=1&action=renew&cid={$this->_contactID}&id={$this->_id}&context=membership&mode={$this->_mode}"
));
}
-
- CRM_Core_Session::setStatus($statusMsg, ts('Complete'), 'success');
}
/**
$this->assign('membershipTypeId', $this->_id);
- if (CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled')) {
+ if (Civi::settings()->get('deferred_revenue_enabled')) {
$deferredFinancialType = CRM_Financial_BAO_FinancialAccount::getDeferredFinancialType();
$this->assign('deferredFinancialType', array_keys($deferredFinancialType));
}
* Are we operating in "single mode", i.e. deleting one
* specific membership?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_single = FALSE;
* Are we operating in "single mode", i.e. sending email to one
* specific contact?
*
- * @var boolean
+ * @var bool
*/
public $_noEmails = FALSE;
/**
* Is this field required
- * @var boolean
+ * @var bool
*/
public $_required;
protected $_fileName;
- /**
- * #@+
- * @var integer
- */
-
/**
* Imported file size
* @var int
/**
* Whether the file has a column header or not
*
- * @var boolean
+ * @var bool
*/
protected $_haveColumnHeader;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
*
* Generated from xml/schema/CRM/PCP/PCP.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4585e6f51f50242cba89fe9325c44c44)
+ * (GenCodeChecksum:e130d04d9fad8bcec628fac504ff9da7)
*/
/**
/**
* Personal Campaign Page ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Contact ID
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
* The Contribution or Event Page which triggered this pcp
*
- * @var int unsigned
+ * @var int
*/
public $page_id;
/**
* The pcp block that this pcp page was created from
*
- * @var int unsigned
+ * @var int
*/
public $pcp_block_id;
/**
- * @var int unsigned
+ * @var int
*/
public $is_thermometer;
/**
- * @var int unsigned
+ * @var int
*/
public $is_honor_roll;
/**
* Is Personal Campaign Page enabled/active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Notify owner via email when someone donates to page?
*
- * @var boolean
+ * @var bool
*/
public $is_notify;
'pseudoconstant' => [
'optionGroupName' => 'pcp_status',
'optionEditPath' => 'civicrm/admin/options/pcp_status',
- ]
+ ],
],
'title' => [
'name' => 'title',
'description' => ts('Goal amount of this Personal Campaign Page.'),
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_pcp.goal_amount',
'table_name' => 'civicrm_pcp',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'is_active' => [
'name' => 'is_active',
*
* Generated from xml/schema/CRM/PCP/PCPBlock.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7cd542a1105ef4cf3ca8596869042754)
+ * (GenCodeChecksum:deacae800c52be5e0de763f8bccf4578)
*/
/**
/**
* PCP block Id
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_contribution_page.id OR civicrm_event.id
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* The entity that this pcp targets
*
- * @var int unsigned
+ * @var int
*/
public $target_entity_id;
/**
* FK to civicrm_uf_group.id. Does Personal Campaign Page require manual activation by administrator? (is inactive by default after setup)?
*
- * @var int unsigned
+ * @var int
*/
public $supporter_profile_id;
/**
* FK to civicrm_option_group with name = PCP owner notifications
*
- * @var int unsigned
+ * @var int
*/
public $owner_notify_id;
/**
* Does Personal Campaign Page require manual activation by administrator? (is inactive by default after setup)?
*
- * @var boolean
+ * @var bool
*/
public $is_approval_needed;
/**
* Does Personal Campaign Page allow using tell a friend?
*
- * @var boolean
+ * @var bool
*/
public $is_tellfriend_enabled;
/**
* Maximum recipient fields allowed in tell a friend
*
- * @var int unsigned
+ * @var int
*/
public $tellfriend_limit;
/**
* Is Personal Campaign Page Block enabled/active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
'pseudoconstant' => [
'optionGroupName' => 'pcp_owner_notify',
'optionEditPath' => 'civicrm/admin/options/pcp_owner_notify',
- ]
+ ],
],
'is_approval_needed' => [
'name' => 'is_approval_needed',
/**
* Are we in single form mode or wizard mode?
*
- * @var boolean
+ * @var bool
*/
public $_single;
foreach ($date as $field => $value) {
switch ($field) {
case 'contribution_date':
- $form->addDate('start_date', ts('First installment payment'));
- $paymentDate = $value = date('m/d/Y');
- list($defaults['start_date'], $defaults['start_date_time']) = CRM_Utils_Date::setDateDefaults(NULL);
+ $form->add('datepicker', 'start_date', ts('First installment payment'), [], FALSE, ['time' => FALSE]);
+ $paymentDate = $value = date('Y-m-d');
+ $defaults['start_date'] = $value;
$form->assign('is_date', TRUE);
break;
case 'calendar_date':
- $form->addDate('start_date', ts('First installment payment'));
- list($defaults['start_date'], $defaults['start_date_time']) = CRM_Utils_Date::setDateDefaults($value);
+ $form->add('datepicker', 'start_date', ts('First installment payment'), [], FALSE, ['time' => FALSE]);
+ $defaults['start_date'] = $value;
$form->assign('is_date', TRUE);
$paymentDate = $value;
break;
$month = CRM_Utils_Date::getCalendarDayOfMonth();
$form->add('select', 'start_date', ts('Day of month installments paid'), $month);
$paymentDate = CRM_Pledge_BAO_Pledge::getPaymentDate($value);
- list($defaults['start_date'], $defaults['start_date_time']) = CRM_Utils_Date::setDateDefaults($paymentDate);
+ $defaults['start_date'] = $paymentDate;
break;
default:
*
* Generated from xml/schema/CRM/Pledge/Pledge.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4c4aab1d03d146815017589777121bbb)
+ * (GenCodeChecksum:877e6098c175e69f385b22f61958b70c)
*/
/**
/**
* Pledge ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Foreign key to civicrm_contact.id .
*
- * @var int unsigned
+ * @var int
*/
public $contact_id;
/**
* FK to Financial Type
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* The Contribution Page which triggered this contribution
*
- * @var int unsigned
+ * @var int
*/
public $contribution_page_id;
/**
* Number of time units for recurrence of pledge payments.
*
- * @var int unsigned
+ * @var int
*/
public $frequency_interval;
/**
* Day in the period when the pledge payment is due e.g. 1st of month, 15th etc. Use this to set the scheduled dates for pledge payments.
*
- * @var int unsigned
+ * @var int
*/
public $frequency_day;
/**
* Total number of payments to be made.
*
- * @var int unsigned
+ * @var int
*/
public $installments;
/**
* The maximum number of payment reminders to send for any given payment.
*
- * @var int unsigned
+ * @var int
*/
public $max_reminders;
/**
* Send initial reminder this many days prior to the payment due date.
*
- * @var int unsigned
+ * @var int
*/
public $initial_reminder_day;
/**
* Send additional reminder this many days after last one sent, up to maximum number of reminders.
*
- * @var int unsigned
+ * @var int
*/
public $additional_reminder_day;
/**
* Implicit foreign key to civicrm_option_values in the pledge_status option group.
*
- * @var int unsigned
+ * @var int
*/
public $status_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_test;
/**
* The campaign for which this pledge has been initiated.
*
- * @var int unsigned
+ * @var int
*/
public $campaign_id;
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'pledge_contribution_page_id' => [
'name' => 'contribution_page_id',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_pledge.amount',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_pledge.original_installment_amount',
'export' => TRUE,
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'pledge_frequency_unit' => [
'name' => 'frequency_unit',
'optionGroupName' => 'recur_frequency_units',
'keyColumn' => 'name',
'optionEditPath' => 'civicrm/admin/options/recur_frequency_units',
- ]
+ ],
],
'pledge_frequency_interval' => [
'name' => 'frequency_interval',
'pseudoconstant' => [
'optionGroupName' => 'pledge_status',
'optionEditPath' => 'civicrm/admin/options/pledge_status',
- ]
+ ],
],
'pledge_is_test' => [
'name' => 'is_test',
'table' => 'civicrm_campaign',
'keyColumn' => 'id',
'labelColumn' => 'title',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Pledge/PledgeBlock.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cdc529b617a76a84e18455737f4e7a03)
+ * (GenCodeChecksum:0ba3eca2bf0f4b6ebd0f9b3617d5bef0)
*/
/**
/**
* Pledge ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to entity table specified in entity_table column.
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* Is frequency interval exposed on the contribution form.
*
- * @var boolean
+ * @var bool
*/
public $is_pledge_interval;
/**
* The maximum number of payment reminders to send for any given payment.
*
- * @var int unsigned
+ * @var int
*/
public $max_reminders;
/**
* Send initial reminder this many days prior to the payment due date.
*
- * @var int unsigned
+ * @var int
*/
public $initial_reminder_day;
/**
* Send additional reminder this many days after last one sent, up to maximum number of reminders.
*
- * @var int unsigned
+ * @var int
*/
public $additional_reminder_day;
/**
* If true - recurring start date is shown.
*
- * @var boolean
+ * @var bool
*/
public $is_pledge_start_date_visible;
/**
* If true - recurring start date is editable.
*
- * @var boolean
+ * @var bool
*/
public $is_pledge_start_date_editable;
*
* Generated from xml/schema/CRM/Pledge/PledgePayment.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:79875dd118415179172c3ac425758b29)
+ * (GenCodeChecksum:afb095a766df0f45f3aed1ff3b24e852)
*/
/**
public static $_log = TRUE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to Pledge table
*
- * @var int unsigned
+ * @var int
*/
public $pledge_id;
/**
* FK to contribution table.
*
- * @var int unsigned
+ * @var int
*/
public $contribution_id;
/**
* The number of payment reminders sent.
*
- * @var int unsigned
+ * @var int
*/
public $reminder_count;
/**
- * @var int unsigned
+ * @var int
*/
public $status_id;
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_pledge_payment.scheduled_amount',
'description' => ts('Actual amount that is paid as the Pledged installment amount.'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_pledge_payment.actual_amount',
'keyColumn' => 'name',
'labelColumn' => 'full_name',
'nameColumn' => 'name',
- ]
+ ],
],
'pledge_payment_scheduled_date' => [
'name' => 'scheduled_date',
'pseudoconstant' => [
'optionGroupName' => 'contribution_status',
'optionEditPath' => 'civicrm/admin/options/contribution_status',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact.
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
* Are we operating in "single mode", i.e. deleting one
* specific pledge?
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_single = FALSE;
/**
* Are we restricting ourselves to a single contact
*
- * @var boolean
+ * @var bool
*/
protected $_limit = NULL;
CRM_Price_BAO_PriceSet::addTo($baoName, $newId, $copyPriceSet->id);
}
else {
- $copyPriceSet = &CRM_Core_DAO::copyGeneric('CRM_Price_DAO_PriceSetEntity',
+ $copyPriceSet = CRM_Core_DAO::copyGeneric('CRM_Price_DAO_PriceSetEntity',
[
'entity_id' => $id,
'entity_table' => $baoName,
*
* Generated from xml/schema/CRM/Price/LineItem.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:efca4ce3a24803ffca3180f7a81ea6f2)
+ * (GenCodeChecksum:6345c550c1c0605c0c25be1cc0382183)
*/
/**
/**
* Line Item
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* entry in table
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* FK to civicrm_contribution
*
- * @var int unsigned
+ * @var int
*/
public $contribution_id;
/**
* FK to civicrm_price_field
*
- * @var int unsigned
+ * @var int
*/
public $price_field_id;
/**
* Participant count for field
*
- * @var int unsigned
+ * @var int
*/
public $participant_count;
/**
* FK to civicrm_price_field_value
*
- * @var int unsigned
+ * @var int
*/
public $price_field_value_id;
/**
* FK to Financial Type.
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_line_item.qty',
'table_name' => 'civicrm_line_item',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_line_item.unit_price',
'table_name' => 'civicrm_line_item',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_line_item.line_total',
'table_name' => 'civicrm_line_item',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'non_deductible_amount' => [
'name' => 'non_deductible_amount',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_line_item.non_deductible_amount',
'headerPattern' => '/non?.?deduct/i',
'description' => ts('tax of each item'),
'precision' => [
20,
- 2
+ 2,
],
'import' => TRUE,
'where' => 'civicrm_line_item.tax_amount',
*
* Generated from xml/schema/CRM/Price/PriceField.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e9ff5a22489167a421efd2f415ba4f58)
+ * (GenCodeChecksum:ccea318a7e83c8fd6d03734e20798b15)
*/
/**
/**
* Price Field
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_price_set
*
- * @var int unsigned
+ * @var int
*/
public $price_set_id;
/**
* Enter a quantity for this field?
*
- * @var boolean
+ * @var bool
*/
public $is_enter_qty;
/**
* Should the price be displayed next to the label for each option?
*
- * @var boolean
+ * @var bool
*/
public $is_display_amounts;
/**
* number of options per line for checkbox and radio
*
- * @var int unsigned
+ * @var int
*/
public $options_per_line;
/**
* Is this price field active
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Is this price field required (value must be > 1)
*
- * @var boolean
+ * @var bool
*/
public $is_required;
/**
* Implicit FK to civicrm_option_group with name = 'visibility'
*
- * @var int unsigned
+ * @var int
*/
public $visibility_id;
],
'pseudoconstant' => [
'callback' => 'CRM_Price_BAO_PriceField::htmlTypes',
- ]
+ ],
],
'is_enter_qty' => [
'name' => 'is_enter_qty',
'pseudoconstant' => [
'optionGroupName' => 'visibility',
'optionEditPath' => 'civicrm/admin/options/visibility',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Price/PriceFieldValue.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a3de204f039daa85984316fae2c60975)
+ * (GenCodeChecksum:6c2bd575335eeb9915683296952b2c3e)
*/
/**
/**
* Price Field Value
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* FK to civicrm_price_field
*
- * @var int unsigned
+ * @var int
*/
public $price_field_id;
/**
* Number of participants per field option
*
- * @var int unsigned
+ * @var int
*/
public $count;
/**
* Max number of participants per field options
*
- * @var int unsigned
+ * @var int
*/
public $max_value;
/**
* FK to Membership Type
*
- * @var int unsigned
+ * @var int
*/
public $membership_type_id;
/**
* Number of terms for this membership
*
- * @var int unsigned
+ * @var int
*/
public $membership_num_terms;
/**
* Is this default price field option
*
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
* Is this price field value active
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* FK to Financial Type.
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* Implicit FK to civicrm_option_group with name = 'visibility'
*
- * @var int unsigned
+ * @var int
*/
public $visibility_id;
'required' => TRUE,
'precision' => [
18,
- 9
+ 9,
],
'where' => 'civicrm_price_field_value.amount',
'table_name' => 'civicrm_price_field_value',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'non_deductible_amount' => [
'name' => 'non_deductible_amount',
'required' => TRUE,
'precision' => [
20,
- 2
+ 2,
],
'where' => 'civicrm_price_field_value.non_deductible_amount',
'headerPattern' => '/non?.?deduct/i',
'pseudoconstant' => [
'optionGroupName' => 'visibility',
'optionEditPath' => 'civicrm/admin/options/visibility',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
*
* Generated from xml/schema/CRM/Price/PriceSet.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a66d639b335e9df4c3133ade2aa16a9b)
+ * (GenCodeChecksum:5dcf30888df8309f20fa347780f16f4d)
*/
/**
/**
* Price Set
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this price-set for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Is this price set active
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* FK to Financial Type(for membership price sets only).
*
- * @var int unsigned
+ * @var int
*/
public $financial_type_id;
/**
* Is set if edited on Contribution or Event Page rather than through Manage Price Sets
*
- * @var boolean
+ * @var bool
*/
public $is_quick_config;
/**
* Is this a predefined system price set (i.e. it can not be deleted, edited)?
*
- * @var boolean
+ * @var bool
*/
public $is_reserved;
/**
* Minimum Amount required for this set.
*
- * @var int unsigned
+ * @var int
*/
public $min_amount;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'name' => [
'name' => 'name',
'table' => 'civicrm_component',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'financial_type_id' => [
'name' => 'financial_type_id',
'table' => 'civicrm_financial_type',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'is_quick_config' => [
'name' => 'is_quick_config',
*
* Generated from xml/schema/CRM/Price/PriceSetEntity.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ba2a78bcd5c6c34e2a81d1bcef776ca3)
+ * (GenCodeChecksum:8bd26effd43fe4ee752addf11e6a4769)
*/
/**
/**
* Price Set Entity
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Item in table
*
- * @var int unsigned
+ * @var int
*/
public $entity_id;
/**
* price set being used
*
- * @var int unsigned
+ * @var int
*/
public $price_set_id;
/**
* The price set is reserved or not.
*
- * @var boolean
+ * @var bool
*/
protected $_isSetReserved = FALSE;
/**
* The price set is reserved or not.
*
- * @var boolean
+ * @var bool
*/
protected $_isSetReserved = FALSE;
/**
* Should we bypass permissions.
*
- * @var boolean
+ * @var bool
*/
protected $_skipPermission;
/**
* Do we enable mapping of users.
*
- * @var boolean
+ * @var bool
*/
protected $_map;
/**
* Do we enable edit link.
*
- * @var boolean
+ * @var bool
*/
protected $_editLink;
/**
* Should we link to the UF Profile.
*
- * @var boolean
+ * @var bool
*/
protected $_linkToUF;
*
* Generated from xml/schema/CRM/Queue/QueueItem.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c9e273e55020d73d90150ef7d6e04312)
+ * (GenCodeChecksum:375c90f10f805de0cc712cad771cf15e)
*/
/**
public static $_log = FALSE;
/**
- * @var int unsigned
+ * @var int
*/
public $id;
*
* Generated from xml/schema/CRM/Report/ReportInstance.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:08099952886e51709d4f1ecbd9feefaf)
+ * (GenCodeChecksum:22eeac140cc540874af36a422c548078)
*/
/**
/**
* Report Instance ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* Which Domain is this instance for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
/**
* Is this entry active?
*
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* FK to contact table.
*
- * @var int unsigned
+ * @var int
*/
public $created_id;
/**
* FK to contact table.
*
- * @var int unsigned
+ * @var int
*/
public $owner_id;
/**
* FK to navigation ID
*
- * @var int unsigned
+ * @var int
*/
public $navigation_id;
/**
* FK to instance ID drilldown to
*
- * @var int unsigned
+ * @var int
*/
public $drilldown_id;
/**
- * @var boolean
+ * @var bool
*/
public $is_reserved;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
'title' => [
'name' => 'title',
/**
* The id of the report instance
*
- * @var integer
+ * @var int
*/
protected $_id;
/**
* The id of the report template
*
- * @var integer;
+ * @var int
*/
protected $_templateID;
* when $_output mode is not 'html' or 'group' so as not to have to interpret / mess with that part
* of the code (see limit() fn.
*
- * @var integer
+ * @var int
*/
protected $_limitValue = NULL;
/**
* This can be set to specify row offset
* See notes on _limitValue
- * @var integer
+ *
+ * @var int
*/
protected $_offsetValue = NULL;
/**
/**
* Flag to indicate if result-set is to be stored in a class variable which could be retrieved using getResultSet() method.
*
- * @var boolean
+ * @var bool
*/
protected $_storeResultSet = FALSE;
/**
* When _storeResultSet Flag is set use this var to store result set in form of array
*
- * @var boolean
+ * @var bool
*/
protected $_resultSet = [];
/**
* Variables to hold the acl inner join and where clause
- * @var string|NULL
+ * @var string|null
*/
protected $_aclFrom = NULL;
protected $_aclWhere = NULL;
*
* (it's unclear if this could be merged with outputMode at this stage)
*
- * @var string|NULL
+ * @var string|null
*/
protected $_format;
public $_havingClauses = [];
/**
- * DashBoardRowCount Dashboard row count
- * @var Integer
+ * DashBoardRowCount Dashboard row count.
+ *
+ * @var int
*/
public $_dashBoardRowCount;
/**
* Is this being called without a form controller (ie. the report is being render outside the normal form
- * - e.g the api is retrieving the rows
- * @var boolean
+ * - e.g the api is retrieving the rows.
+ *
+ * @var bool
*/
public $noController = FALSE;
/**
- * Variable to hold the currency alias
- * @var string|NULL
+ * Variable to hold the currency alias.
+ *
+ * @var string|null
*/
protected $_currencyColumn = NULL;
public $_section;
/**
- * @var string Report description.
+ * Report description.
+ *
+ * @var string
*/
public $_description;
/**
- * @var bool Is an address field selected.
+ * Is an address field selected.
+ *
+ * @var bool
* This was intended to determine if the address table should be joined in
* The isTableSelected function is now preferred for this purpose
*/
protected $_addressField;
/**
- * @var bool Is an email field selected.
+ * Is an email field selected.
+ *
+ * @var bool
* This was intended to determine if the email table should be joined in
* The isTableSelected function is now preferred for this purpose
*/
protected $_emailField;
/**
- * @var bool Is a phone field selected.
+ * Is a phone field selected.
+ *
+ * @var bool
* This was intended to determine if the phone table should be joined in
* The isTableSelected function is now preferred for this purpose
*/
protected $_phoneField;
/**
- * @var bool Create new report instance? (or update existing) on save.
+ * Create new report instance? (or update existing) on save.
+ *
+ * @var bool
*/
protected $_createNew;
* When a grand total row has calculated the status we pop it off to here.
*
* This allows us to access it from the stats function and avoid recalculating.
+ *
* @var array
*/
protected $rollupRow = [];
/**
- * @var string Database attributes - character set and collation
+ * Database attributes - character set and collation.
+ *
+ * @var string
*/
protected $_databaseAttributes = ' DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci';
* @return string
*/
public function createTemporaryTable($identifier, $sql, $isColumns = FALSE, $isMemory = FALSE) {
- $tempTable = CRM_Utils_SQL_TempTable::build()->setUtf8();
+ $tempTable = CRM_Utils_SQL_TempTable::build();
if ($isMemory) {
$tempTable->setMemory();
}
'type' => CRM_Utils_Type::T_INT,
'no_display' => TRUE,
'required' => TRUE,
- 'dbAlias' => '(address_civireport.street_number % 2)',
+ 'dbAlias' => "({$tableAlias}_civireport.street_number % 2)",
'is_fields' => TRUE,
'is_order_bys' => TRUE,
],
$fieldValueMap[$responseField->option_group_id][$responseField->value] = $value;
}
}
- $responseField->free();
//actual data formatting.
$hasData = FALSE;
'required' => TRUE,
'no_display' => TRUE,
),
+ 'contribution_page_id' => array(
+ 'title' => ts('Contribution Page'),
+ ),
'total_amount' => array(
'title' => ts('Contribution Amount Stats'),
'default' => TRUE,
'default' => array(1),
'type' => CRM_Utils_Type::T_INT,
),
+ 'contribution_page_id' => array(
+ 'title' => ts('Contribution Page'),
+ 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
+ 'options' => CRM_Contribute_PseudoConstant::contributionPage(),
+ 'type' => CRM_Utils_Type::T_INT,
+ ),
'currency' => array(
'title' => ts('Currency'),
'operatorType' => CRM_Report_Form::OP_MULTISELECT,
'default' => array(1),
'type' => CRM_Utils_Type::T_INT,
),
+ 'contribution_page_id' => array(
+ 'title' => ts('Contribution Page'),
+ 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
+ 'options' => CRM_Contribute_PseudoConstant::contributionPage(),
+ 'type' => CRM_Utils_Type::T_INT,
+ ),
),
),
'civicrm_financial_trxn' => array(
$contriSQL = "SELECT {$contriQuery} {$group} {$this->_having}";
$contriDAO = CRM_Core_DAO::executeQuery($contriSQL);
-
+ $this->addToDeveloperTab($contriSQL);
$totalAmount = $average = $mode = $median = $softTotalAmount = $softAverage = array();
$count = $softCount = 0;
while ($contriDAO->fetch()) {
if ($softCredit) {
$softDAO = CRM_Core_DAO::executeQuery($softSQL);
+ $this->addToDeveloperTab($softSQL);
while ($softDAO->fetch()) {
$softTotalAmount[]
= CRM_Utils_Money::format($softDAO->civicrm_contribution_soft_soft_amount_sum, $softDAO->currency) .
*/
public function buildRows($sql, &$rows) {
$dao = CRM_Core_DAO::executeQuery($sql);
+ $this->addToDeveloperTab($sql);
if (!is_array($rows)) {
$rows = array();
}
$this->customDataFrom();
$contriSQL = "{$this->_select} {$this->_from} {$this->_where} {$this->_groupBy} {$this->_having} {$this->_orderBy} {$this->_limit}";
$contriDAO = CRM_Core_DAO::executeQuery($contriSQL);
+ $this->addToDeveloperTab($contriSQL);
$contriFields = array(
'civicrm_contribution_total_amount_sum',
'civicrm_contribution_total_amount_avg',
public function alterDisplay(&$rows) {
$entryFound = FALSE;
$contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus();
+ $contributionPages = CRM_Contribute_PseudoConstant::contributionPage();
foreach ($rows as $rowNum => $row) {
// make count columns point to detail report
$entryFound = TRUE;
}
+ if ($value = CRM_Utils_Array::value('civicrm_contribution_contribution_page_id', $row)) {
+ $rows[$rowNum]['civicrm_contribution_contribution_page_id'] = $contributionPages[$value];
+ $entryFound = TRUE;
+ }
+
// If using campaigns, convert campaign_id to campaign title
if (array_key_exists('civicrm_contribution_campaign_id', $row)) {
if ($value = $row['civicrm_contribution_campaign_id']) {
while ($dao->fetch()) {
$contactIds[] = $dao->cid;
}
- $dao->free();
$this->setPager();
}
$contributionSum = 0;
}
}
- $dao->free();
}
// format result set.
$this->formatDisplay($rows, FALSE);
$eventID = implode(',', $eventIDs);
- $participantStatus = CRM_Event_PseudoConstant::participantStatus(NULL, "is_counted = 1", "label");
$participantRole = CRM_Event_PseudoConstant::participantRole();
$paymentInstruments = CRM_Contribute_PseudoConstant::paymentInstrument();
if ($optionGroupDAO->find(TRUE)) {
$optionGroupId = $optionGroupDAO->id;
}
- //show the income of active participant status (Counted = filter = 1)
- $activeParticipantStatusIDArray = $activeParticipantStatusLabelArray = [];
- foreach ($participantStatus as $id => $label) {
- $activeParticipantStatusIDArray[] = $id;
- $activeParticipantStatusLabelArray[] = $label;
- }
- $activeParticipantStatus = implode(',', $activeParticipantStatusIDArray);
- $activeparticipnatStutusLabel = implode(', ', $activeParticipantStatusLabelArray);
- $activeParticipantClause = " AND civicrm_participant.status_id IN ( $activeParticipantStatus ) ";
+
+ $activeParticipantClause = " AND civicrm_participant.status_id IN ( " . implode(',', array_keys($this->getActiveParticipantStatuses())) . " ) ";
$select = [
"civicrm_event.id as event_id",
"civicrm_event.title as event_title",
$eventSummary[$eventDAO->event_id][ts('End Date')] = CRM_Utils_Date::customFormat($eventDAO->end_date);
$eventSummary[$eventDAO->event_id][ts('Event Type')] = $eventDAO->event_type;
$eventSummary[$eventDAO->event_id][ts('Event Income')] = CRM_Utils_Money::format($eventDAO->total, $eventDAO->currency);
- $eventSummary[$eventDAO->event_id][ts('Registered Participant')] = "{$eventDAO->participant} ({$activeparticipnatStutusLabel})";
+ $eventSummary[$eventDAO->event_id][ts('Registered Participant')] = "{$eventDAO->participant} ({" . implode(', ', $this->getActiveParticipantStatuses()) . ")";
$currency[$eventDAO->event_id] = $eventDAO->currency;
}
$this->assign_by_ref('summary', $eventSummary);
$statusDAO = $this->executeReportQuery($status);
+ $participantStatus = $this->getActiveParticipantStatuses();
while ($statusDAO->fetch()) {
$statusRows[$statusDAO->event_id][$participantStatus[$statusDAO->STATUSID]]['total'] = $statusDAO->participant;
$statusRows[$statusDAO->event_id][$participantStatus[$statusDAO->STATUSID]]['round'] = round(($statusDAO->participant / $count[$statusDAO->event_id]) * 100, 2);
parent::endPostProcess();
}
+ /**
+ * Get statuses with the counted filter set to TRUE.
+ *
+ * @return array
+ */
+ protected function getActiveParticipantStatuses() {
+ return CRM_Event_PseudoConstant::participantStatus(NULL, "is_counted = 1", "label");
+ }
+
}
+++ /dev/null
-<?php
-/*
- +--------------------------------------------------------------------+
- | CiviCRM version 5 |
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2019 |
- +--------------------------------------------------------------------+
- | 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-2019
- * $Id$
- *
- */
-class CRM_Report_Form_Extended extends CRM_Report_Form {
- protected $_addressField = FALSE;
-
- protected $_emailField = FALSE;
-
- protected $_summary = NULL;
-
- protected $_customGroupExtends = [];
- protected $_baseTable = 'civicrm_contact';
-
- /**
- *
- */
- public function __construct() {
- parent::__construct();
- }
-
- /**
- *
- */
- public function preProcess() {
- parent::preProcess();
- }
-
- /**
- *
- */
- public function select() {
- parent::select();
- }
-
- /**
- * From clause build where baseTable & fromClauses are defined
- */
- public function from() {
- if (!empty($this->_baseTable)) {
- $this->buildACLClause($this->_aliases['civicrm_contact']);
- $this->_from = "FROM {$this->_baseTable} {$this->_aliases[$this->_baseTable]}";
- $availableClauses = $this->getAvailableJoins();
- foreach ($this->fromClauses() as $fromClause) {
- $fn = $availableClauses[$fromClause]['callback'];
- $this->$fn();
- }
- if (strstr($this->_from, 'civicrm_contact')) {
- $this->_from .= $this->_aclFrom;
- }
- }
- }
-
- /**
- * Define any from clauses in use (child classes to override)
- *
- * @return array
- */
- public function fromClauses() {
- return [];
- }
-
- public function groupBy() {
- parent::groupBy();
- //@todo - need to re-visit this - bad behaviour from pa
- if ($this->_groupBy == 'GROUP BY') {
- $this->_groupBY = NULL;
- }
- // if a stat field has been selected the do a group by
- if (!empty($this->_statFields) && empty($this->_groupBy)) {
- $this->_groupBy[] = $this->_aliases[$this->_baseTable] . ".id";
- }
- //@todo - this should be in the parent function or at parent level - perhaps build query should do this?
- if (!empty($this->_groupBy) && is_array($this->_groupBy)) {
- $this->_groupBy = 'GROUP BY ' . implode(',', $this->_groupBy);
- }
- }
-
- public function orderBy() {
- parent::orderBy();
- }
-
- /**
- * @param array $rows
- *
- * @return array
- */
- public function statistics(&$rows) {
- return parent::statistics($rows);
- }
-
- public function postProcess() {
- if (!empty($this->_aclTable) && !empty($this->_aliases[$this->_aclTable])) {
- $this->buildACLClause($this->_aliases[$this->_aclTable]);
- }
- parent::postProcess();
- }
-
- /**
- * Alter display of rows.
- *
- * Iterate through the rows retrieved via SQL and make changes for display purposes,
- * such as rendering contacts as links.
- *
- * @param array $rows
- * Rows generated by SQL, with an array for each row.
- */
- public function alterDisplay(&$rows) {
- parent::alterDisplay($rows);
-
- //THis is all generic functionality which can hopefully go into the parent class
- // it introduces the option of defining an alter display function as part of the column definition
- // @tod tidy up the iteration so it happens in this function
- list($firstRow) = $rows;
- // no result to alter
- if (empty($firstRow)) {
- return;
- }
- $selectedFields = array_keys($firstRow);
-
- $alterfunctions = $altermap = [];
- foreach ($this->_columns as $tablename => $table) {
- if (array_key_exists('fields', $table)) {
- foreach ($table['fields'] as $field => $specs) {
- if (in_array($tablename . '_' . $field, $selectedFields) &&
- array_key_exists('alter_display', $specs)
- ) {
- $alterfunctions[$tablename . '_' .
- $field] = $specs['alter_display'];
- $altermap[$tablename . '_' . $field] = $field;
- }
- }
- }
- }
- if (empty($alterfunctions)) {
- // - no manipulation to be done
- return;
- }
-
- foreach ($rows as $index => & $row) {
- foreach ($row as $selectedfield => $value) {
- if (array_key_exists($selectedfield, $alterfunctions)) {
- $rows[$index][$selectedfield] = $this->{$alterfunctions[$selectedfield]}($value, $row, $selectedfield, $altermap[$selectedfield]);
- }
- }
- }
- }
-
- /**
- * @return array
- */
- public function getLineItemColumns() {
- return [
- 'civicrm_line_item' => [
- 'dao' => 'CRM_Price_BAO_LineItem',
- 'fields' => [
- 'qty' => [
- 'title' => ts('Quantity'),
- 'type' => CRM_Utils_Type::T_INT,
- 'statistics' => ['sum' => ts('Total Quantity Selected')],
- ],
- 'unit_price' => [
- 'title' => ts('Unit Price'),
- ],
- 'line_total' => [
- 'title' => ts('Line Total'),
- 'type' => CRM_Utils_Type::T_MONEY,
- 'statistics' => ['sum' => ts('Total of Line Items')],
- ],
- ],
- 'participant_count' => [
- 'title' => ts('Participant Count'),
- 'statistics' => ['sum' => ts('Total Participants')],
- ],
- 'filters' => [
- 'qty' => [
- 'title' => ts('Quantity'),
- 'type' => CRM_Utils_Type::T_INT,
- 'operator' => CRM_Report_Form::OP_INT,
- ],
- ],
- 'group_bys' => [
- 'price_field_id' => [
- 'title' => ts('Price Field'),
- ],
- 'price_field_value_id' => [
- 'title' => ts('Price Field Option'),
- ],
- 'line_item_id' => [
- 'title' => ts('Individual Line Item'),
- 'name' => 'id',
- ],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getPriceFieldValueColumns() {
- return [
- 'civicrm_price_field_value' => [
- 'dao' => 'CRM_Price_BAO_PriceFieldValue',
- 'fields' => [
- 'price_field_value_label' => [
- 'title' => ts('Price Field Value Label'),
- 'name' => 'label',
- ],
- ],
- 'filters' => [
- 'price_field_value_label' => [
- 'title' => ts('Price Fields Value Label'),
- 'type' => CRM_Utils_Type::T_STRING,
- 'operator' => 'like',
- 'name' => 'label',
- ],
- ],
- 'order_bys' => [
- 'label' => [
- 'title' => ts('Price Field Value Label'),
- ],
- ],
- //note that we have a requirement to group by label such that all 'Promo book' lines
- 'group_bys' =>
- // are grouped together across price sets but there may be a separate need to group
- // by id so that entries in one price set are distinct from others. Not quite sure what
- // to call the distinction for end users benefit
- [
- 'price_field_value_label' => [
- 'title' => ts('Price Field Value Label'),
- 'name' => 'label',
- ],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getPriceFieldColumns() {
- return [
- 'civicrm_price_field' => [
- 'dao' => 'CRM_Price_BAO_PriceField',
- 'fields' => [
- 'price_field_label' => [
- 'title' => ts('Price Field Label'),
- 'name' => 'label',
- ],
- ],
- 'filters' => [
- 'price_field_label' => [
- 'title' => ts('Price Field Label'),
- 'type' => CRM_Utils_Type::T_STRING,
- 'operator' => 'like',
- 'name' => 'label',
- ],
- ],
- 'order_bys' => [
- 'price_field_label' => [
- 'title' => ts('Price Field Label'),
- 'name' => 'label',
- ],
- ],
- 'group_bys' => [
- 'price_field_label' => [
- 'title' => ts('Price Field Label'),
- 'name' => 'label',
- ],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getParticipantColumns() {
- static $_events = [];
- if (!isset($_events['all'])) {
- CRM_Core_PseudoConstant::populate($_events['all'], 'CRM_Event_DAO_Event', FALSE, 'title', 'is_active', "is_template IS NULL OR is_template = 0", 'end_date DESC');
- }
- return [
- 'civicrm_participant' => [
- 'dao' => 'CRM_Event_DAO_Participant',
- 'fields' => [
- 'participant_id' => ['title' => ts('Participant ID')],
- 'participant_record' => [
- 'name' => 'id',
- 'title' => ts('Participant ID'),
- ],
- 'event_id' => [
- 'title' => ts('Event ID'),
- 'type' => CRM_Utils_Type::T_STRING,
- 'alter_display' => 'alterEventID',
- ],
- 'status_id' => [
- 'title' => ts('Status'),
- 'alter_display' => 'alterParticipantStatus',
- ],
- 'role_id' => [
- 'title' => ts('Role'),
- 'alter_display' => 'alterParticipantRole',
- ],
- 'participant_fee_level' => NULL,
- 'participant_fee_amount' => NULL,
- 'participant_register_date' => ['title' => ts('Registration Date')],
- ],
- 'grouping' => 'event-fields',
- 'filters' => [
- 'event_id' => [
- 'name' => 'event_id',
- 'title' => ts('Event'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => $_events['all'],
- ],
- 'sid' => [
- 'name' => 'status_id',
- 'title' => ts('Participant Status'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Event_PseudoConstant::participantStatus(NULL, NULL, 'label'),
- ],
- 'rid' => [
- 'name' => 'role_id',
- 'title' => ts('Participant Role'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Event_PseudoConstant::participantRole(),
- ],
- 'participant_register_date' => [
- 'title' => ts('Registration Date'),
- 'operatorType' => CRM_Report_Form::OP_DATE,
- ],
- ],
- 'order_bys' => [
- 'event_id' => [
- 'title' => ts('Event'),
- 'default_weight' => '1',
- 'default_order' => 'ASC',
- ],
- ],
- 'group_bys' => [
- 'event_id' => ['title' => ts('Event')],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getMembershipColumns() {
- return [
- 'civicrm_membership' => [
- 'dao' => 'CRM_Member_DAO_Membership',
- 'grouping' => 'member-fields',
- 'fields' => [
- 'membership_type_id' => [
- 'title' => ts('Membership Type'),
- 'required' => TRUE,
- 'alter_display' => 'alterMembershipTypeID',
- ],
- 'status_id' => [
- 'title' => ts('Membership Status'),
- 'required' => TRUE,
- 'alter_display' => 'alterMembershipStatusID',
- ],
- 'join_date' => NULL,
- 'start_date' => [
- 'title' => ts('Current Cycle Start Date'),
- ],
- 'end_date' => [
- 'title' => ts('Current Membership Cycle End Date'),
- ],
- ],
- 'group_bys' => [
- 'membership_type_id' => [
- 'title' => ts('Membership Type'),
- ],
- ],
- 'filters' => [
- 'join_date' => [
- 'type' => CRM_Utils_Type::T_DATE,
- 'operatorType' => CRM_Report_Form::OP_DATE,
- ],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getMembershipTypeColumns() {
- return [
- 'civicrm_membership_type' => [
- 'dao' => 'CRM_Member_DAO_MembershipType',
- 'grouping' => 'member-fields',
- 'filters' => [
- 'gid' => [
- 'name' => 'id',
- 'title' => ts('Membership Types'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'type' => CRM_Utils_Type::T_INT + CRM_Utils_Type::T_ENUM,
- 'options' => CRM_Member_PseudoConstant::membershipType(),
- ],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getEventColumns() {
- return [
- 'civicrm_event' => [
- 'dao' => 'CRM_Event_DAO_Event',
- 'fields' => [
- 'id' => [
- 'no_display' => TRUE,
- 'required' => TRUE,
- ],
- 'title' => [
- 'title' => ts('Event Title'),
- 'required' => TRUE,
- ],
- 'event_type_id' => [
- 'title' => ts('Event Type'),
- 'required' => TRUE,
- 'alter_display' => 'alterEventType',
- ],
- 'fee_label' => ['title' => ts('Fee Label')],
- 'event_start_date' => [
- 'title' => ts('Event Start Date'),
- ],
- 'event_end_date' => ['title' => ts('Event End Date')],
- 'max_participants' => [
- 'title' => ts('Capacity'),
- 'type' => CRM_Utils_Type::T_INT,
- ],
- ],
- 'grouping' => 'event-fields',
- 'filters' => [
- 'event_type_id' => [
- 'name' => 'event_type_id',
- 'title' => ts('Event Type'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Core_OptionGroup::values('event_type'),
- ],
- 'event_title' => [
- 'name' => 'title',
- 'title' => ts('Event Title'),
- 'operatorType' => CRM_Report_Form::OP_STRING,
- ],
- ],
- 'order_bys' => [
- 'event_type_id' => [
- 'title' => ts('Event Type'),
- 'default_weight' => '2',
- 'default_order' => 'ASC',
- ],
- ],
- 'group_bys' => [
- 'event_type_id' => [
- 'title' => ts('Event Type'),
- ],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getContributionColumns() {
- return [
- 'civicrm_contribution' => [
- 'dao' => 'CRM_Contribute_DAO_Contribution',
- 'fields' => [
- 'contribution_id' => [
- 'name' => 'id',
- ],
- 'financial_type_id' => [
- 'title' => ts('Financial Type'),
- 'default' => TRUE,
- 'alter_display' => 'alterContributionType',
- ],
- 'payment_instrument_id' => [
- 'title' => ts('Payment Method'),
- 'alter_display' => 'alterPaymentType',
- ],
- 'source' => ['title' => ts('Contribution Source')],
- 'trxn_id' => NULL,
- 'receive_date' => ['default' => TRUE],
- 'receipt_date' => NULL,
- 'fee_amount' => NULL,
- 'net_amount' => NULL,
- 'total_amount' => [
- 'title' => ts('Amount'),
- 'statistics' => ['sum' => ts('Total Amount')],
- 'type' => CRM_Utils_Type::T_MONEY,
- ],
- ],
- 'filters' => [
- 'receive_date' => ['operatorType' => CRM_Report_Form::OP_DATE],
- 'financial_type_id' => [
- 'title' => ts('Financial Type'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Contribute_PseudoConstant::financialType(),
- ],
- 'payment_instrument_id' => [
- 'title' => ts('Payment Type'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Contribute_PseudoConstant::paymentInstrument(),
- ],
- 'contribution_status_id' => [
- 'title' => ts('Contribution Status'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Contribute_PseudoConstant::contributionStatus(),
- ],
- 'total_amount' => ['title' => ts('Contribution Amount')],
- ],
- 'order_bys' => [
- 'payment_instrument_id' => [
- 'title' => ts('Payment Method'),
- ],
- 'financial_type_id' => [
- 'title' => ts('Financial Type'),
- ],
- ],
- 'group_bys' => [
- 'financial_type_id' => ['title' => ts('Financial Type')],
- 'payment_instrument_id' => ['title' => ts('Payment Method')],
- 'contribution_id' => [
- 'title' => ts('Individual Contribution'),
- 'name' => 'id',
- ],
- 'source' => ['title' => ts('Contribution Source')],
- ],
- 'grouping' => 'contribution-fields',
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getContactColumns() {
- return [
- 'civicrm_contact' => [
- 'dao' => 'CRM_Contact_DAO_Contact',
- 'fields' => [
- 'display_name' => [
- 'title' => ts('Contact Name'),
- ],
- 'id' => [
- 'title' => ts('Contact ID'),
- 'alter_display' => 'alterContactID',
- ],
- 'first_name' => [
- 'title' => ts('First Name'),
- ],
- 'last_name' => [
- 'title' => ts('Last Name'),
- ],
- 'nick_name' => [
- 'title' => ts('Nickname'),
- 'alter_display' => 'alterNickname',
- ],
- ],
- 'filters' => [
- 'id' => [
- 'title' => ts('Contact ID'),
- ],
- 'sort_name' => [
- 'title' => ts('Contact Name'),
- ],
- ],
- 'grouping' => 'contact-fields',
- 'order_bys' => [
- 'sort_name' => [
- 'title' => ts('Last Name, First Name'),
- 'default' => '1',
- 'default_weight' => '0',
- 'default_order' => 'ASC',
- ],
- ],
- ],
- ];
- }
-
- /**
- * @return array
- */
- public function getCaseColumns() {
- return [
- 'civicrm_case' => [
- 'dao' => 'CRM_Case_DAO_Case',
- 'fields' => [
- 'id' => [
- 'title' => ts('Case ID'),
- 'required' => FALSE,
- ],
- 'subject' => [
- 'title' => ts('Case Subject'),
- 'default' => TRUE,
- ],
- 'status_id' => [
- 'title' => ts('Status'),
- 'default' => TRUE,
- ],
- 'case_type_id' => [
- 'title' => ts('Case Type'),
- 'default' => TRUE,
- ],
- 'case_start_date' => [
- 'title' => ts('Case Start Date'),
- 'name' => 'start_date',
- 'default' => TRUE,
- ],
- 'case_end_date' => [
- 'title' => ts('Case End Date'),
- 'name' => 'end_date',
- 'default' => TRUE,
- ],
- 'case_duration' => [
- 'name' => 'duration',
- 'title' => ts('Duration (Days)'),
- 'default' => FALSE,
- ],
- 'case_is_deleted' => [
- 'name' => 'is_deleted',
- 'title' => ts('Case Deleted?'),
- 'default' => FALSE,
- 'type' => CRM_Utils_Type::T_INT,
- ],
- ],
- 'filters' => [
- 'case_start_date' => [
- 'title' => ts('Case Start Date'),
- 'operatorType' => CRM_Report_Form::OP_DATE,
- 'type' => CRM_Utils_Type::T_DATE,
- 'name' => 'start_date',
- ],
- 'case_end_date' => [
- 'title' => ts('Case End Date'),
- 'operatorType' => CRM_Report_Form::OP_DATE,
- 'type' => CRM_Utils_Type::T_DATE,
- 'name' => 'end_date',
- ],
- 'case_type_id' => [
- 'title' => ts('Case Type'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => $this->case_types,
- ],
- 'case_status_id' => [
- 'title' => ts('Case Status'),
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => $this->case_statuses,
- 'name' => 'status_id',
- ],
- 'case_is_deleted' => [
- 'title' => ts('Case Deleted?'),
- 'type' => CRM_Report_Form::OP_INT,
- 'operatorType' => CRM_Report_Form::OP_SELECT,
- 'options' => $this->deleted_labels,
- 'default' => 0,
- 'name' => 'is_deleted',
- ],
- ],
- ],
- ];
- }
-
- /**
- * Get address columns to add to array.
- *
- * @param array $options
- * Options for the report.
- * - prefix prefix to add (e.g. 'honor' when getting address details for honor contact
- * - prefix_label optional prefix lable eg. "Honoree " for front end
- * - group_by enable these fields for group by - default false
- * - order_by enable these fields for order by
- * - filters enable these fields for filtering
- * - defaults - (is this working?) values to pre-populate
- *
- * @return array
- * address columns definition
- */
- public function getAddressColumns($options = []) {
- $defaultOptions = [
- 'prefix' => '',
- 'prefix_label' => '',
- 'group_by' => FALSE,
- 'order_by' => TRUE,
- 'filters' => TRUE,
- 'defaults' => [
- 'country_id' => TRUE,
- ],
- ];
-
- $options = array_merge($defaultOptions, $options);
-
- $addressFields = [
- $options['prefix'] . 'civicrm_address' => [
- 'dao' => 'CRM_Core_DAO_Address',
- 'name' => 'civicrm_address',
- 'alias' => $options['prefix'] . 'civicrm_address',
- 'fields' => [
- $options['prefix'] . 'name' => [
- 'title' => ts($options['prefix_label'] . 'Address Name'),
- 'default' => CRM_Utils_Array::value('name', $options['defaults'], FALSE),
- 'name' => 'name',
- ],
- $options['prefix'] . 'street_address' => [
- 'title' => ts($options['prefix_label'] . 'Street Address'),
- 'default' => CRM_Utils_Array::value('street_address', $options['defaults'], FALSE),
- 'name' => 'street_address',
- ],
- $options['prefix'] . 'supplemental_address_1' => [
- 'title' => ts($options['prefix_label'] .
- 'Supplementary Address Field 1'),
- 'default' => CRM_Utils_Array::value('supplemental_address_1', $options['defaults'], FALSE),
- 'name' => 'supplemental_address_1',
- ],
- $options['prefix'] . 'supplemental_address_2' => [
- 'title' => ts($options['prefix_label'] .
- 'Supplementary Address Field 2'),
- 'default' => CRM_Utils_Array::value('supplemental_address_2', $options['defaults'], FALSE),
- 'name' => 'supplemental_address_2',
- ],
- $options['prefix'] . 'supplemental_address_3' => [
- 'title' => ts($options['prefix_label'] .
- 'Supplementary Address Field 3'),
- 'default' => CRM_Utils_Array::value('supplemental_address_3', $options['defaults'], FALSE),
- 'name' => 'supplemental_address_3',
- ],
- $options['prefix'] . 'street_number' => [
- 'name' => 'street_number',
- 'title' => ts($options['prefix_label'] . 'Street Number'),
- 'type' => 1,
- 'default' => CRM_Utils_Array::value('street_number', $options['defaults'], FALSE),
- ],
- $options['prefix'] . 'street_name' => [
- 'name' => 'street_name',
- 'title' => ts($options['prefix_label'] . 'Street Name'),
- 'type' => 1,
- 'default' => CRM_Utils_Array::value('street_name', $options['defaults'], FALSE),
- ],
- $options['prefix'] . 'street_unit' => [
- 'name' => 'street_unit',
- 'title' => ts($options['prefix_label'] . 'Street Unit'),
- 'type' => 1,
- 'default' => CRM_Utils_Array::value('street_unit', $options['defaults'], FALSE),
- ],
- $options['prefix'] . 'city' => [
- 'title' => ts($options['prefix_label'] . 'City'),
- 'default' => CRM_Utils_Array::value('city', $options['defaults'], FALSE),
- 'name' => 'city',
- ],
- $options['prefix'] . 'postal_code' => [
- 'title' => ts($options['prefix_label'] . 'Postal Code'),
- 'default' => CRM_Utils_Array::value('postal_code', $options['defaults'], FALSE),
- 'name' => 'postal_code',
- ],
- $options['prefix'] . 'county_id' => [
- 'title' => ts($options['prefix_label'] . 'County'),
- 'default' => CRM_Utils_Array::value('county_id', $options['defaults'], FALSE),
- 'alter_display' => 'alterCountyID',
- 'name' => 'county_id',
- ],
- $options['prefix'] . 'state_province_id' => [
- 'title' => ts($options['prefix_label'] . 'State/Province'),
- 'default' => CRM_Utils_Array::value('state_province_id', $options['defaults'], FALSE),
- 'alter_display' => 'alterStateProvinceID',
- 'name' => 'state_province_id',
- ],
- $options['prefix'] . 'country_id' => [
- 'title' => ts($options['prefix_label'] . 'Country'),
- 'default' => CRM_Utils_Array::value('country_id', $options['defaults'], FALSE),
- 'alter_display' => 'alterCountryID',
- 'name' => 'country_id',
- ],
- ],
- 'grouping' => 'location-fields',
- ],
- ];
-
- if ($options['filters']) {
- $addressFields[$options['prefix'] . 'civicrm_address']['filters'] = [
- $options['prefix'] . 'street_number' => [
- 'title' => ts($options['prefix_label'] . 'Street Number'),
- 'type' => 1,
- 'name' => 'street_number',
- ],
- $options['prefix'] . 'street_name' => [
- 'title' => ts($options['prefix_label'] . 'Street Name'),
- 'name' => $options['prefix'] . 'street_name',
- 'operator' => 'like',
- ],
- $options['prefix'] . 'postal_code' => [
- 'title' => ts($options['prefix_label'] . 'Postal Code'),
- 'type' => 1,
- 'name' => 'postal_code',
- ],
- $options['prefix'] . 'city' => [
- 'title' => ts($options['prefix_label'] . 'City'),
- 'operator' => 'like',
- 'name' => 'city',
- ],
- $options['prefix'] . 'county_id' => [
- 'name' => 'county_id',
- 'title' => ts($options['prefix_label'] . 'County'),
- 'type' => CRM_Utils_Type::T_INT,
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Core_PseudoConstant::county(),
- ],
- $options['prefix'] . 'state_province_id' => [
- 'name' => 'state_province_id',
- 'title' => ts($options['prefix_label'] . 'State/Province'),
- 'type' => CRM_Utils_Type::T_INT,
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Core_PseudoConstant::stateProvince(),
- ],
- $options['prefix'] . 'country_id' => [
- 'name' => 'country_id',
- 'title' => ts($options['prefix_label'] . 'Country'),
- 'type' => CRM_Utils_Type::T_INT,
- 'operatorType' => CRM_Report_Form::OP_MULTISELECT,
- 'options' => CRM_Core_PseudoConstant::country(),
- ],
- ];
- }
-
- if ($options['order_by']) {
- $addressFields[$options['prefix'] .
- 'civicrm_address']['order_bys'] = [
- $options['prefix'] . 'street_name' => [
- 'title' => ts($options['prefix_label'] . 'Street Name'),
- 'name' => 'street_name',
- ],
- $options['prefix'] . 'street_number' => [
- 'title' => ts($options['prefix_label'] . 'Odd / Even Street Number'),
- 'name' => 'street_number',
- ],
- $options['prefix'] . 'street_address' => [
- 'title' => ts($options['prefix_label'] . 'Street Address'),
- 'name' => 'street_address',
- ],
- $options['prefix'] . 'city' => [
- 'title' => ts($options['prefix_label'] . 'City'),
- 'name' => 'city',
- ],
- $options['prefix'] . 'postal_code' => [
- 'title' => ts($options['prefix_label'] . 'Post Code'),
- 'name' => 'postal_code',
- ],
- ];
- }
-
- if ($options['group_by']) {
- $addressFields['civicrm_address']['group_bys'] = [
- $options['prefix'] . 'street_address' => [
- 'title' => ts($options['prefix_label'] . 'Street Address'),
- 'name' => 'street_address',
- ],
- $options['prefix'] . 'city' => [
- 'title' => ts($options['prefix_label'] . 'City'),
- 'name' => 'city',
- ],
- $options['prefix'] . 'postal_code' => [
- 'title' => ts($options['prefix_label'] . 'Post Code'),
- 'name' => 'postal_code',
- ],
- $options['prefix'] . 'state_province_id' => [
- 'title' => ts($options['prefix_label'] . 'State/Province'),
- 'name' => 'state_province_id',
- ],
- $options['prefix'] . 'country_id' => [
- 'title' => ts($options['prefix_label'] . 'Country'),
- 'name' => 'country_id',
- ],
- $options['prefix'] . 'county_id' => [
- 'title' => ts($options['prefix_label'] . 'County'),
- 'name' => 'county_id',
- ],
- ];
- }
- return $addressFields;
- }
-
- /**
- * Get Information about advertised Joins.
- *
- * @return array
- */
- public function getAvailableJoins() {
- return [
- 'priceFieldValue_from_lineItem' => [
- 'leftTable' => 'civicrm_line_item',
- 'rightTable' => 'civicrm_price_field_value',
- 'callback' => 'joinPriceFieldValueFromLineItem',
- ],
- 'priceField_from_lineItem' => [
- 'leftTable' => 'civicrm_line_item',
- 'rightTable' => 'civicrm_price_field',
- 'callback' => 'joinPriceFieldFromLineItem',
- ],
- 'participant_from_lineItem' => [
- 'leftTable' => 'civicrm_line_item',
- 'rightTable' => 'civicrm_participant',
- 'callback' => 'joinParticipantFromLineItem',
- ],
- 'contribution_from_lineItem' => [
- 'leftTable' => 'civicrm_line_item',
- 'rightTable' => 'civicrm_contribution',
- 'callback' => 'joinContributionFromLineItem',
- ],
- 'membership_from_lineItem' => [
- 'leftTable' => 'civicrm_line_item',
- 'rightTable' => 'civicrm_membership',
- 'callback' => 'joinMembershipFromLineItem',
- ],
- 'contribution_from_participant' => [
- 'leftTable' => 'civicrm_participant',
- 'rightTable' => 'civicrm_contribution',
- 'callback' => 'joinContributionFromParticipant',
- ],
- 'contribution_from_membership' => [
- 'leftTable' => 'civicrm_membership',
- 'rightTable' => 'civicrm_contribution',
- 'callback' => 'joinContributionFromMembership',
- ],
- 'membership_from_contribution' => [
- 'leftTable' => 'civicrm_contribution',
- 'rightTable' => 'civicrm_membership',
- 'callback' => 'joinMembershipFromContribution',
- ],
- 'membershipType_from_membership' => [
- 'leftTable' => 'civicrm_membership',
- 'rightTable' => 'civicrm_membership_type',
- 'callback' => 'joinMembershipTypeFromMembership',
- ],
- 'lineItem_from_contribution' => [
- 'leftTable' => 'civicrm_contribution',
- 'rightTable' => 'civicrm_line_item',
- 'callback' => 'joinLineItemFromContribution',
- ],
- 'lineItem_from_membership' => [
- 'leftTable' => 'civicrm_membership',
- 'rightTable' => 'civicrm_line_item',
- 'callback' => 'joinLineItemFromMembership',
- ],
- 'contact_from_participant' => [
- 'leftTable' => 'civicrm_participant',
- 'rightTable' => 'civicrm_contact',
- 'callback' => 'joinContactFromParticipant',
- ],
- 'contact_from_membership' => [
- 'leftTable' => 'civicrm_membership',
- 'rightTable' => 'civicrm_contact',
- 'callback' => 'joinContactFromMembership',
- ],
- 'contact_from_contribution' => [
- 'leftTable' => 'civicrm_contribution',
- 'rightTable' => 'civicrm_contact',
- 'callback' => 'joinContactFromContribution',
- ],
- 'event_from_participant' => [
- 'leftTable' => 'civicrm_participant',
- 'rightTable' => 'civicrm_event',
- 'callback' => 'joinEventFromParticipant',
- ],
- 'address_from_contact' => [
- 'leftTable' => 'civicrm_contact',
- 'rightTable' => 'civicrm_address',
- 'callback' => 'joinAddressFromContact',
- ],
- ];
- }
-
- /**
- * Add join from contact table to address. Prefix will be added to both tables
- * as it's assumed you are using it to get address of a secondary contact
- *
- * @param string $prefix
- */
- public function joinAddressFromContact($prefix = '') {
- $this->_from .= " LEFT JOIN civicrm_address {$this->_aliases[$prefix .
- 'civicrm_address']}
- ON {$this->_aliases[$prefix .
- 'civicrm_address']}.contact_id = {$this->_aliases[$prefix .
- 'civicrm_contact']}.id";
- }
-
- public function joinPriceFieldValueFromLineItem() {
- $this->_from .= " LEFT JOIN civicrm_price_field_value {$this->_aliases['civicrm_price_field_value']}
- ON {$this->_aliases['civicrm_line_item']}.price_field_value_id = {$this->_aliases['civicrm_price_field_value']}.id";
- }
-
- public function joinPriceFieldFromLineItem() {
- $this->_from .= "
- LEFT JOIN civicrm_price_field {$this->_aliases['civicrm_price_field']}
- ON {$this->_aliases['civicrm_line_item']}.price_field_id = {$this->_aliases['civicrm_price_field']}.id
- ";
- }
-
- /**
- * Define join from line item table to participant table.
- */
- public function joinParticipantFromLineItem() {
- $this->_from .= " LEFT JOIN civicrm_participant {$this->_aliases['civicrm_participant']}
- ON ( {$this->_aliases['civicrm_line_item']}.entity_id = {$this->_aliases['civicrm_participant']}.id
- AND {$this->_aliases['civicrm_line_item']}.entity_table = 'civicrm_participant')
- ";
- }
-
- /**
- * Define join from line item table to Membership table. Seems to be still via contribution
- * as the entity. Have made 'inner' to restrict does that make sense?
- */
- public function joinMembershipFromLineItem() {
- $this->_from .= " INNER JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']}
- ON ( {$this->_aliases['civicrm_line_item']}.entity_id = {$this->_aliases['civicrm_contribution']}.id
- AND {$this->_aliases['civicrm_line_item']}.entity_table = 'civicrm_contribution')
- LEFT JOIN civicrm_membership_payment pp
- ON {$this->_aliases['civicrm_contribution']}.id = pp.contribution_id
- LEFT JOIN civicrm_membership {$this->_aliases['civicrm_membership']}
- ON pp.membership_id = {$this->_aliases['civicrm_membership']}.id
- ";
- }
-
- /**
- * Define join from Participant to Contribution table.
- */
- public function joinContributionFromParticipant() {
- $this->_from .= " LEFT JOIN civicrm_participant_payment pp
- ON {$this->_aliases['civicrm_participant']}.id = pp.participant_id
- LEFT JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']}
- ON pp.contribution_id = {$this->_aliases['civicrm_contribution']}.id
- ";
- }
-
- /**
- * Define join from Membership to Contribution table.
- */
- public function joinContributionFromMembership() {
- $this->_from .= " LEFT JOIN civicrm_membership_payment pp
- ON {$this->_aliases['civicrm_membership']}.id = pp.membership_id
- LEFT JOIN civicrm_contribution {$this->_aliases['civicrm_contribution']}
- ON pp.contribution_id = {$this->_aliases['civicrm_contribution']}.id
- ";
- }
-
- public function joinParticipantFromContribution() {
- $this->_from .= " LEFT JOIN civicrm_participant_payment pp
- ON {$this->_aliases['civicrm_contribution']}.id = pp.contribution_id
- LEFT JOIN civicrm_participant {$this->_aliases['civicrm_participant']}
- ON pp.participant_id = {$this->_aliases['civicrm_participant']}.id";
- }
-
- public function joinMembershipFromContribution() {
- $this->_from .= "
- LEFT JOIN civicrm_membership_payment pp
- ON {$this->_aliases['civicrm_contribution']}.id = pp.contribution_id
- LEFT JOIN civicrm_membership {$this->_aliases['civicrm_membership']}
- ON pp.membership_id = {$this->_aliases['civicrm_membership']}.id";
- }
-
- public function joinMembershipTypeFromMembership() {
- $this->_from .= "
- LEFT JOIN civicrm_membership_type {$this->_aliases['civicrm_membership_type']}
- ON {$this->_aliases['civicrm_membership']}.membership_type_id = {$this->_aliases['civicrm_membership_type']}.id
- ";
- }
-
- public function joinContributionFromLineItem() {
-
- // this can be stored as a temp table & indexed for more speed. Not done at this state.
- // another option is to cache it but I haven't tried to put that code in yet (have used it before for one hour caching
- $this->_from .= " LEFT JOIN (SELECT line_item_civireport.id as lid, contribution_civireport_direct.*
-FROM civicrm_line_item line_item_civireport
-LEFT JOIN civicrm_contribution contribution_civireport_direct
- ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id = contribution_civireport_direct.id AND line_item_civireport.entity_table = 'civicrm_contribution')
-
-
-WHERE contribution_civireport_direct.id IS NOT NULL
-
-UNION SELECT line_item_civireport.id as lid, contribution_civireport.*
- FROM civicrm_line_item line_item_civireport
- LEFT JOIN civicrm_participant participant_civireport
- ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id = participant_civireport.id AND line_item_civireport.entity_table = 'civicrm_participant')
-
-LEFT JOIN civicrm_participant_payment pp
- ON participant_civireport.id = pp.participant_id
- LEFT JOIN civicrm_contribution contribution_civireport
- ON pp.contribution_id = contribution_civireport.id
-
-UNION SELECT line_item_civireport.id as lid,contribution_civireport.*
- FROM civicrm_line_item line_item_civireport
- LEFT JOIN civicrm_membership membership_civireport
- ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id =membership_civireport.id AND line_item_civireport.entity_table = 'civicrm_membership')
-
-LEFT JOIN civicrm_membership_payment pp
- ON membership_civireport.id = pp.membership_id
- LEFT JOIN civicrm_contribution contribution_civireport
- ON pp.contribution_id = contribution_civireport.id
-) as {$this->_aliases['civicrm_contribution']}
- ON {$this->_aliases['civicrm_contribution']}.lid = {$this->_aliases['civicrm_line_item']}.id
- ";
- }
-
- public function joinLineItemFromContribution() {
-
- // this can be stored as a temp table & indexed for more speed. Not done at this stage.
- // another option is to cache it but I haven't tried to put that code in yet (have used it before for one hour caching
- $this->_from .= "
- LEFT JOIN (
-SELECT contribution_civireport_direct.id AS contid, line_item_civireport.*
-FROM civicrm_contribution contribution_civireport_direct
-LEFT JOIN civicrm_line_item line_item_civireport ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id = contribution_civireport_direct.id AND line_item_civireport.entity_table = 'civicrm_contribution')
-WHERE line_item_civireport.id IS NOT NULL
-
-UNION
-SELECT contribution_civireport_direct.id AS contid, line_item_civireport.*
-FROM civicrm_contribution contribution_civireport_direct
-LEFT JOIN civicrm_participant_payment pp ON contribution_civireport_direct.id = pp.contribution_id
-LEFT JOIN civicrm_participant p ON pp.participant_id = p.id
-LEFT JOIN civicrm_line_item line_item_civireport ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id = p.id AND line_item_civireport.entity_table = 'civicrm_participant')
-WHERE line_item_civireport.id IS NOT NULL
-
-UNION
-
-SELECT contribution_civireport_direct.id AS contid, line_item_civireport.*
-FROM civicrm_contribution contribution_civireport_direct
-LEFT JOIN civicrm_membership_payment pp ON contribution_civireport_direct.id = pp.contribution_id
-LEFT JOIN civicrm_membership p ON pp.membership_id = p.id
-LEFT JOIN civicrm_line_item line_item_civireport ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id = p.id AND line_item_civireport.entity_table = 'civicrm_membership')
-WHERE line_item_civireport.id IS NOT NULL
-) as {$this->_aliases['civicrm_line_item']}
- ON {$this->_aliases['civicrm_line_item']}.contid = {$this->_aliases['civicrm_contribution']}.id
-
-
- ";
- }
-
- public function joinLineItemFromMembership() {
-
- // this can be stored as a temp table & indexed for more speed. Not done at this stage.
- // another option is to cache it but I haven't tried to put that code in yet (have used it before for one hour caching
- $this->_from .= "
- LEFT JOIN (
-SELECT contribution_civireport_direct.id AS contid, line_item_civireport.*
-FROM civicrm_contribution contribution_civireport_direct
-LEFT JOIN civicrm_line_item line_item_civireport
-ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id = contribution_civireport_direct.id AND line_item_civireport.entity_table = 'civicrm_contribution')
-
-WHERE line_item_civireport.id IS NOT NULL
-
-UNION
-
-SELECT contribution_civireport_direct.id AS contid, line_item_civireport.*
-FROM civicrm_contribution contribution_civireport_direct
-LEFT JOIN civicrm_membership_payment pp ON contribution_civireport_direct.id = pp.contribution_id
-LEFT JOIN civicrm_membership p ON pp.membership_id = p.id
-LEFT JOIN civicrm_line_item line_item_civireport ON (line_item_civireport.line_total > 0 AND line_item_civireport.entity_id = p.id AND line_item_civireport.entity_table = 'civicrm_membership')
-WHERE line_item_civireport.id IS NOT NULL
-) as {$this->_aliases['civicrm_line_item']}
- ON {$this->_aliases['civicrm_line_item']}.contid = {$this->_aliases['civicrm_contribution']}.id
- ";
- }
-
- public function joinContactFromParticipant() {
- $this->_from .= " LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact']}
- ON {$this->_aliases['civicrm_participant']}.contact_id = {$this->_aliases['civicrm_contact']}.id";
- }
-
- public function joinContactFromMembership() {
- $this->_from .= " LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact']}
- ON {$this->_aliases['civicrm_membership']}.contact_id = {$this->_aliases['civicrm_contact']}.id";
- }
-
- public function joinContactFromContribution() {
- $this->_from .= " LEFT JOIN civicrm_contact {$this->_aliases['civicrm_contact']}
- ON {$this->_aliases['civicrm_contribution']}.contact_id = {$this->_aliases['civicrm_contact']}.id";
- }
-
- public function joinEventFromParticipant() {
- $this->_from .= " LEFT JOIN civicrm_event {$this->_aliases['civicrm_event']}
- ON ({$this->_aliases['civicrm_event']}.id = {$this->_aliases['civicrm_participant']}.event_id ) AND
- ({$this->_aliases['civicrm_event']}.is_template IS NULL OR
- {$this->_aliases['civicrm_event']}.is_template = 0)";
- }
-
- /**
- * Retrieve text for financial type from pseudoconstant.
- *
- * @param $value
- * @param array $row
- *
- * @return string
- */
- public function alterNickName($value, &$row) {
- if (empty($row['civicrm_contact_id'])) {
- return NULL;
- }
- $contactID = $row['civicrm_contact_id'];
- return "<div id=contact-{$contactID} class='crm-entity'>
- <span class='crm-editable crmf-nick_name crm-editable-enabled'>
- " . $value . "</span></div>";
- }
-
- /**
- * Retrieve text for contribution type from pseudoconstant.
- *
- * @param $value
- * @param array $row
- *
- * @return array|string
- */
- public function alterContributionType($value, &$row) {
- return is_string(CRM_Contribute_PseudoConstant::financialType($value, FALSE)) ? CRM_Contribute_PseudoConstant::financialType($value, FALSE) : '';
- }
-
- /**
- * Retrieve text for contribution status from pseudoconstant.
- *
- * @param $value
- * @param array $row
- *
- * @return array
- */
- public function alterContributionStatus($value, &$row) {
- return CRM_Contribute_PseudoConstant::contributionStatus($value);
- }
-
- /**
- * Retrieve text for payment instrument from pseudoconstant.
- *
- * @param $value
- * @param array $row
- *
- * @return array
- */
- public function alterEventType($value, &$row) {
- return CRM_Event_PseudoConstant::eventType($value);
- }
-
- /**
- * @param $value
- * @param array $row
- *
- * @return array|string
- */
- public function alterEventID($value, &$row) {
- return is_string(CRM_Event_PseudoConstant::event($value, FALSE)) ? CRM_Event_PseudoConstant::event($value, FALSE) : '';
- }
-
- /**
- * @param $value
- * @param array $row
- *
- * @return array|string
- */
- public function alterMembershipTypeID($value, &$row) {
- return is_string(CRM_Member_PseudoConstant::membershipType($value, FALSE)) ? CRM_Member_PseudoConstant::membershipType($value, FALSE) : '';
- }
-
- /**
- * @param $value
- * @param array $row
- *
- * @return array|string
- */
- public function alterMembershipStatusID($value, &$row) {
- return is_string(CRM_Member_PseudoConstant::membershipStatus($value, FALSE)) ? CRM_Member_PseudoConstant::membershipStatus($value, FALSE) : '';
- }
-
- /**
- * @param $value
- * @param array $row
- * @param $selectedfield
- * @param string $criteriaFieldName
- *
- * @return array
- */
- public function alterCountryID($value, &$row, $selectedfield, $criteriaFieldName) {
- $url = CRM_Utils_System::url(CRM_Utils_System::currentPath(), "reset=1&force=1&{$criteriaFieldName}_op=in&{$criteriaFieldName}_value={$value}", $this->_absoluteUrl);
- $row[$selectedfield . '_link'] = $url;
- $row[$selectedfield .
- '_hover'] = ts("%1 for this country.", [1 => $value]);
- $countries = CRM_Core_PseudoConstant::country($value, FALSE);
- if (!is_array($countries)) {
- return $countries;
- }
- }
-
- /**
- * @param $value
- * @param array $row
- * @param $selectedfield
- * @param string $criteriaFieldName
- *
- * @return array
- */
- public function alterCountyID($value, &$row, $selectedfield, $criteriaFieldName) {
- $url = CRM_Utils_System::url(CRM_Utils_System::currentPath(), "reset=1&force=1&{$criteriaFieldName}_op=in&{$criteriaFieldName}_value={$value}", $this->_absoluteUrl);
- $row[$selectedfield . '_link'] = $url;
- $row[$selectedfield .
- '_hover'] = ts("%1 for this county.", [1 => $value]);
- $counties = CRM_Core_PseudoConstant::county($value, FALSE);
- if (!is_array($counties)) {
- return $counties;
- }
- }
-
- /**
- * @param $value
- * @param array $row
- * @param $selectedfield
- * @param string $criteriaFieldName
- *
- * @return array
- */
- public function alterStateProvinceID($value, &$row, $selectedfield, $criteriaFieldName) {
- $url = CRM_Utils_System::url(CRM_Utils_System::currentPath(), "reset=1&force=1&{$criteriaFieldName}_op=in&{$criteriaFieldName}_value={$value}", $this->_absoluteUrl);
- $row[$selectedfield . '_link'] = $url;
- $row[$selectedfield .
- '_hover'] = ts("%1 for this state.", [1 => $value]);
-
- $states = CRM_Core_PseudoConstant::stateProvince($value, FALSE);
- if (!is_array($states)) {
- return $states;
- }
- }
-
- /**
- * @param $value
- * @param array $row
- * @param string $fieldname
- *
- * @return mixed
- */
- public function alterContactID($value, &$row, $fieldname) {
- $row[$fieldname . '_link'] = CRM_Utils_System::url("civicrm/contact/view",
- 'reset=1&cid=' . $value, $this->_absoluteUrl);
- return $value;
- }
-
- /**
- * @param $value
- *
- * @return array
- */
- public function alterParticipantStatus($value) {
- if (empty($value)) {
- return NULL;
- }
- return CRM_Event_PseudoConstant::participantStatus($value, FALSE, 'label');
- }
-
- /**
- * @param $value
- *
- * @return string|void
- */
- public function alterParticipantRole($value) {
- if (empty($value)) {
- return NULL;
- }
- $roles = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
- $value = [];
- foreach ($roles as $role) {
- $value[$role] = CRM_Event_PseudoConstant::participantRole($role, FALSE);
- }
- return implode(', ', $value);
- }
-
- /**
- * @param $value
- *
- * @return mixed
- */
- public function alterPaymentType($value) {
- $paymentInstruments = CRM_Contribute_PseudoConstant::paymentInstrument();
- return $paymentInstruments[$value];
- }
-
-}
}
break;
+ case 'nll':
+ case 'nnll':
+ $defaults["{$fieldName}_op"] = $fieldOP;
+ break;
+
case 'in':
case 'notin':
// send the type as string so that multiple values can also be retrieved from url.
*
* Generated from xml/schema/CRM/SMS/Provider.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a24ea48b652eba8827a5275a127df61e)
+ * (GenCodeChecksum:73f7f33374bc59a6251529cd2ba704cf)
*/
/**
/**
* SMS Provider ID
*
- * @var int unsigned
+ * @var int
*/
public $id;
/**
* points to value in civicrm_option_value for group sms_api_type
*
- * @var int unsigned
+ * @var int
*/
public $api_type;
public $api_params;
/**
- * @var boolean
+ * @var bool
*/
public $is_default;
/**
- * @var boolean
+ * @var bool
*/
public $is_active;
/**
* Which Domain is this sms provider for
*
- * @var int unsigned
+ * @var int
*/
public $domain_id;
'table' => 'civicrm_domain',
'keyColumn' => 'id',
'labelColumn' => 'name',
- ]
+ ],
],
];
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
$this->setAttribute('autocomplete', 'off');
$sendOptions = [
- $this->createElement('radio', NULL, NULL, 'Send immediately', 'send_immediate', ['id' => 'send_immediate', 'style' => 'margin-bottom: 10px;']),
- $this->createElement('radio', NULL, NULL, 'Send at:', 'send_later', ['id' => 'send_later']),
+ $this->createElement('radio', NULL, NULL, ts('Send immediately'), 'send_immediate', ['id' => 'send_immediate', 'style' => 'margin-bottom: 10px;']),
+ $this->createElement('radio', NULL, NULL, ts('Send at:'), 'send_later', ['id' => 'send_later']),
];
$this->addGroup($sendOptions, 'send_option', '', '<br>');
class CRM_SMS_Message {
/**
- * @var String
* What address is this SMS message coming from.
+ *
+ * @var string
*/
public $from = '';
/**
- * @var String
* What address is this SMS message going to.
+ *
+ * @var string
*/
public $to = '';
/**
- * @var Integer
- * Contact ID that is matched to the From address
+ * Contact ID that is matched to the From address.
+ *
+ * @var int
*/
public $fromContactID = NULL;
/**
- * @var Integer
- * Contact ID that is matched to the To address
+ * Contact ID that is matched to the To address.
+ *
+ * @var int
*/
public $toContactID = NULL;
/**
- * @var String
- * Body content of the message
+ * Body content of the message.
+ *
+ * @var string
*/
public $body = '';
/**
- * @var Integer
- * Trackable ID in the system to match to
+ * Trackable ID in the system to match to.
+ *
+ * @var int
*/
public $trackID = NULL;
* Is this profile has searchable field.
* or is any field having in selector true.
*
- * @var boolean.
+ * @var bool
*/
protected $_hasSearchableORInSelector;
$name = $this->_selectFields[$params['field_name'][1]];
}
- //Hack for Formatting Field Name
- if ($params['field_name'][0] == 'Formatting') {
- $fieldName = 'formatting_' . rand(1000, 9999);
- }
- else {
- $fieldName = $params['field_name'][1];
- }
+ // If field_name is missing, it's formatting
+ $fieldName = CRM_Utils_Array::value(1, $params['field_name'], 'formatting');
//check for duplicate fields
$apiFormattedParams = $params;
*/
protected function getOtherModuleString() {
$otherModules = CRM_Core_BAO_UFGroup::getUFJoinRecord($this->_id, TRUE, TRUE);
+ $otherModuleString = NULL;
if (!empty($otherModules)) {
- $otherModuleString = NULL;
foreach ($otherModules as $key) {
$otherModuleString .= " [ x ] <label>" . $key . "</label>";
}
/**
* Upgrade for multilingual.
*
- * @var boolean
+ * @var bool
*/
public $multilingual = FALSE;
* @param string $column
* @param string $properties
* @param bool $localizable is this a field that should be localized
- * @param string|NULL $version CiviCRM version to use if rebuilding multilingual schema
+ * @param string|null $version CiviCRM version to use if rebuilding multilingual schema
+ *
* @return bool
*/
public static function addColumn($ctx, $table, $column, $properties, $localizable = FALSE, $version = NULL) {
$domain = new CRM_Core_DAO_Domain();
$domain->find(TRUE);
$queries = [];
- if (!CRM_Core_BAO_SchemaHandler::checkIfFieldExists($table, $column)) {
+ if (!CRM_Core_BAO_SchemaHandler::checkIfFieldExists($table, $column, FALSE)) {
if ($domain->locales) {
if ($localizable) {
$locales = explode(CRM_Core_DAO::VALUE_SEPARATOR, $domain->locales);
foreach ($locales as $locale) {
- if (!CRM_Core_BAO_SchemaHandler::checkIfFieldExists($table, "{$column}_{$locale}")) {
+ if (!CRM_Core_BAO_SchemaHandler::checkIfFieldExists($table, "{$column}_{$locale}", FALSE)) {
$queries[] = "ALTER TABLE `$table` ADD COLUMN `{$column}_{$locale}` $properties";
}
}
}
+ /**
+ * Re-save any valid values from contribute settings into the normal setting
+ * format.
+ *
+ * We render the array of contribution_invoice_settings and any that have
+ * metadata defined we add to the correct key. This is safe to run even if no
+ * settings are to be converted, per the test in
+ * testConvertUpgradeContributeSettings.
+ *
+ * @param $ctx
+ *
+ * @return bool
+ */
+ public static function updateContributeSettings($ctx) {
+ $settings = Civi::settings()->get('contribution_invoice_settings');
+ $metadata = \Civi\Core\SettingsMetadata::getMetadata();
+ $conversions = array_intersect_key((array) $settings, $metadata);
+ foreach ($conversions as $key => $conversion) {
+ Civi::settings()->set($key, $conversion);
+ }
+ return TRUE;
+ }
+
/**
* Do any relevant smart group updates.
*
/**
* Rebuild Multilingual Schema.
* @param CRM_Queue_TaskContext $ctx
- * @param string|NULL $version CiviCRM version to use if rebuilding multilingual schema
+ * @param string|null $version CiviCRM version to use if rebuilding multilingual schema
+ *
* @return bool
*/
public static function rebuildMultilingalSchema($ctx, $version = NULL) {
// ignore the matter and simply run CRM_Core_InnoDBIndexer::fixSchemaDifferences
// after the upgrade. But that's speculative. For now, we'll leave this
// advanced feature in the hands of the sysadmin.
- $preUpgradeMessage .= '<br />' . ts('This database uses InnoDB Full Text Search for optimized searching. The upgrade procedure has not been tested with this feature. You should disable (and later re-enable) the feature by navigating to "Administer => System Settings => Miscellaneous".');
+ $preUpgradeMessage .= '<br />' . ts('This database uses InnoDB Full Text Search for optimized searching. The upgrade procedure has not been tested with this feature. You should disable (and later re-enable) the feature by navigating to "Administer => Customize Data and Screens => Search Preferences".');
}
$ftAclSetting = Civi::settings()->get('acl_financial_type');
--- /dev/null
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5 |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2019 |
+ +--------------------------------------------------------------------+
+ | 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. |
+ | |
+ | 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 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 |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Upgrade logic for FiveFifteen */
+class CRM_Upgrade_Incremental_php_FiveFifteen extends CRM_Upgrade_Incremental_Base {
+
+ /**
+ * Compute any messages which should be displayed beforeupgrade.
+ *
+ * Note: This function is called iteratively for each upcoming
+ * revision to the database.
+ *
+ * @param string $preUpgradeMessage
+ * @param string $rev
+ * a version number, e.g. '4.4.alpha1', '4.4.beta3', '4.4.0'.
+ * @param null $currentVer
+ */
+ public function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
+ // Example: Generate a pre-upgrade message.
+ // if ($rev == '5.12.34') {
+ // $preUpgradeMessage .= '<p>' . ts('A new permission, "%1", has been added. This permission is now used to control access to the Manage Tags screen.', array(1 => ts('manage tags'))) . '</p>';
+ // }
+ }
+
+ /**
+ * Compute any messages which should be displayed after upgrade.
+ *
+ * @param string $postUpgradeMessage
+ * alterable.
+ * @param string $rev
+ * an intermediate version; note that setPostUpgradeMessage is called repeatedly with different $revs.
+ */
+ public function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
+ // Example: Generate a post-upgrade message.
+ // if ($rev == '5.12.34') {
+ // $postUpgradeMessage .= '<br /><br />' . ts("By default, CiviCRM now disables the ability to import directly from SQL. To use this feature, you must explicitly grant permission 'import SQL datasource'.");
+ // }
+ }
+
+ /*
+ * Important! All upgrade functions MUST add a 'runSql' task.
+ * Uncomment and use the following template for a new upgrade version
+ * (change the x in the function name):
+ */
+
+ /**
+ * Upgrade function.
+ *
+ * @param string $rev
+ */
+ public function upgrade_5_15_alpha1($rev) {
+ $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+ $this->addTask('Fix errant deferred revenue settings', 'updateContributeSettings');
+ }
+
+}
* (change the x in the function name):
*/
- // /**
- // * Upgrade function.
- // *
- // * @param string $rev
- // */
- // public function upgrade_5_0_x($rev) {
- // $this->addTask(ts('Upgrade DB to %1: SQL', array(1 => $rev)), 'runSql', $rev);
- // $this->addTask('Do the foo change', 'taskFoo', ...);
- // // Additional tasks here...
- // // Note: do not use ts() in the addTask description because it adds unnecessary strings to transifex.
- // // The above is an exception because 'Upgrade DB to %1: SQL' is generic & reusable.
- // }
+ /**
+ * Upgrade function.
+ *
+ * @param string $rev
+ */
+ public function upgrade_5_14_alpha1($rev) {
+ $this->addTask(ts('Upgrade DB to %1: SQL', array(1 => $rev)), 'runSql', $rev);
+
+ // Only need to rebuild view if CiviCase is enabled: otherwise will be
+ // rebuilt when component is enabled
+ $config = CRM_Core_Config::singleton();
+ if (in_array('CiviCase', $config->enableComponents)) {
+ $this->addTask('Rebuild case activity views', 'rebuildCaseActivityView', $rev);
+ }
+ // Additional tasks here...
+ // Note: do not use ts() in the addTask description because it adds unnecessary strings to transifex.
+ // The above is an exception because 'Upgrade DB to %1: SQL' is generic & reusable.
+ }
- // public static function taskFoo(CRM_Queue_TaskContext $ctx, ...) {
- // return TRUE;
- // }
+ /**
+ * Rebuild the view of recent and upcoming case activities
+ *
+ * See https://github.com/civicrm/civicrm-core/pull/14086 and
+ * https://lab.civicrm.org/dev/core/issues/832
+ *
+ * @param CRM_Queue_TaskContext $ctx
+ * @return bool
+ */
+ public static function rebuildCaseActivityView($ctx) {
+ if (!CRM_Case_BAO_Case::createCaseViews()) {
+ CRM_Core_Error::debug_log_message(ts("Could not create the MySQL views for CiviCase. Your mysql user needs to have the 'CREATE VIEW' permission"));
+ return FALSE;
+ }
+ return TRUE;
+ }
}
--- /dev/null
+{* file to handle db changes in 5.14.beta1 during upgrade *}
--- /dev/null
+{* file to handle db changes in 5.15.alpha1 during upgrade *}
\Civi\Core\Resolver::singleton()->call($this->callback, $this->args);
}
+ /**
+ * Prohibit (de)serialization of CRM_Utils_AutoClean.
+ *
+ * The generic nature of AutoClean makes it a potential target for escalating
+ * serialization vulnerabilities, and there's no good reason for serializing it.
+ */
+ public function __sleep() {
+ throw new \RuntimeException("CRM_Utils_AutoClean is a runtime helper. It is not intended for serialization.");
+ }
+
+ /**
+ * Prohibit (de)serialization of CRM_Utils_AutoClean.
+ *
+ * The generic nature of AutoClean makes it a potential target for escalating
+ * serialization vulnerabilities, and there's no good reason for deserializing it.
+ */
+ public function __wakeup() {
+ throw new \RuntimeException("CRM_Utils_AutoClean is a runtime helper. It is not intended for deserialization.");
+ }
+
}
);
}
else {
+ $cronLink = 'target="_blank" href="' . htmlentities(CRM_Utils_System::docURL2('sysadmin/setup/jobs/', TRUE)) . '""';
+ $msg .= '<p>' . ts('To enable scheduling support, please <a %1>set up the cron job</a>.', [
+ 1 => $cronLink,
+ ]) . '</p>';
$message = new CRM_Utils_Check_Message(
__FUNCTION__,
$msg,
($lastCron > gmdate('U') - 86400) ? \Psr\Log\LogLevel::WARNING : \Psr\Log\LogLevel::ERROR,
'fa-clock-o'
);
- $docUrl = 'target="_blank" href="' . CRM_Utils_System::docURL(['resource' => 'wiki', 'page' => 'Managing Scheduled Jobs', 'URLonly' => TRUE]) . '""';
- $message->addHelp(
- ts('Configuring cron on your server is necessary for running scheduled jobs such as sending mail and scheduled reminders.') . '<br />' .
- ts("Learn more in the <a %1>online documentation</a>.", [1 => $docUrl])
- );
$messages[] = $message;
}
public static function checkFinancialAclReport() {
$messages = [];
$ftAclSetting = Civi::settings()->get('acl_financial_type');
- $financialAclExtension = civicrm_api3('extension', 'get', ['key' => 'biz.jmaconsulting.financialaclreport']);
- if ($ftAclSetting && (($financialAclExtension['count'] == 1 && $financialAclExtension['status'] != 'Installed') || $financialAclExtension['count'] !== 1)) {
+ $financialAclExtension = civicrm_api3('extension', 'get', ['key' => 'biz.jmaconsulting.financialaclreport', 'sequential' => 1]);
+ if ($ftAclSetting && (($financialAclExtension['count'] == 1 && $financialAclExtension['values'][0]['status'] != 'Installed') || $financialAclExtension['count'] !== 1)) {
$messages[] = new CRM_Utils_Check_Message(
__FUNCTION__,
ts('CiviCRM will in the future require the extension %1 for CiviCRM Reports to work correctly with the Financial Type ACLs. The extension can be downloaded <a href="%2">here</a>', [
return FALSE;
}
+ /**
+ * Get the extensions that this MimeTpe is for
+ * @param string $mimeType the mime-type we want extensions for
+ * @return array
+ */
+ public static function getAcceptableExtensionsForMimeType($mimeType = NULL) {
+ $mapping = \MimeType\Mapping::$types;
+ $extensions = [];
+ foreach ($mapping as $extension => $type) {
+ if ($mimeType == $type) {
+ $extensions[] = $extension;
+ }
+ }
+ return $extensions;
+ }
+
+ /**
+ * Get the extension of a file based on its path
+ * @param string $path path of the file to query
+ * @return string
+ */
+ public static function getExtensionFromPath($path) {
+ return pathinfo($path, PATHINFO_EXTENSION);
+ }
+
}
Civi::dispatcher()->dispatch('hook_civicrm_alterAngular', $event);
}
+ /**
+ * This hook is called when building a link to a semi-static asset.
+ *
+ * @param string $asset
+ * The name of the asset.
+ * Ex: 'angular.json'
+ * @param array $params
+ * List of optional arguments which influence the content.
+ * @return null
+ * the return value is ignored
+ */
+ public static function getAssetUrl(&$asset, &$params) {
+ return self::singleton()->invoke(['asset', 'params'],
+ $asset, $params, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject,
+ 'civicrm_getAssetUrl'
+ );
+ }
+
/**
* This hook is called whenever the system builds a new copy of
* semi-static asset.
* @param string $region
*/
public static function coreResourceList(&$list, $region) {
- // First allow the cms integration to add to the list
- CRM_Core_Config::singleton()->userSystem->appendCoreResources($list);
-
self::singleton()->invoke(['list', 'region'], $list, $region,
self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject,
'civicrm_coreResourceList'
*/
public static function commaSeparatedIntegers($value) {
foreach (explode(',', $value) as $val) {
+ // Remove any Whitespace around the key.
+ $val = trim($val);
if (!self::positiveInteger($val)) {
return FALSE;
}
*
* Example 3: Create an empty temp table with list of columns.
*
- * $tmpTbl = CRM_Utils_SQL_TempTable::build()->setDurable()->setUtf8()->createWithColumns('id int(10, name varchar(64)');
+ * $tmpTbl = CRM_Utils_SQL_TempTable::build()->setDurable()->createWithColumns('id int(10, name varchar(64)');
*
* Example 4: Drop a table that you previously created.
*
$t->id = md5(uniqid('', TRUE));
// The constant CIVICRM_TEMP_FORCE_DURABLE is for local debugging.
$t->durable = CRM_Utils_Constant::value('CIVICRM_TEMP_FORCE_DURABLE', FALSE);
- // @deprecated This constant is deprecated and will be removed.
- $t->utf8 = CRM_Utils_Constant::value('CIVICRM_TEMP_FORCE_UTF8', TRUE);
+ $t->utf8 = TRUE;
$t->autodrop = FALSE;
$t->memory = FALSE;
return $t;
/**
* Set table collation to UTF8.
*
- * This would make sense as a default but cautiousness during phasing in has made it opt-in.
+ * @deprecated This method is deprecated as tables should be assumed to have
+ * UTF-8 as the default character set and collation; some other character set
+ * or collation may be specified in the column definition.
*
* @param bool $value
*
* @method static int getLoggedInUfID() Get current logged in user id.
* @method static setHttpHeader(string $name, string $value) Set http header.
* @method static array synchronizeUsers() Create CRM contacts for all existing CMS users.
+ * @method static appendCoreResources(\Civi\Core\Event\GenericHookEvent $e) Callback for hook_civicrm_coreResourceList.
+ * @method static alterAssetUrl(\Civi\Core\Event\GenericHookEvent $e) Callback for hook_civicrm_getAssetUrl.
*/
class CRM_Utils_System {
$print = FALSE,
$maintenance = FALSE
) {
- $config = &CRM_Core_Config::singleton();
- return $config->userSystem->theme($content, $print, $maintenance);
+ return CRM_Core_Config::singleton()->userSystem->theme($content, $print, $maintenance);
}
/**
* @return mixed
*/
public static function formatDocUrl($url) {
- return preg_replace('#^user/#', 'user/en/stable/', $url);
+ return preg_replace('#^(user|sysadmin|dev)/#', '\1/en/stable/', $url);
}
/**
$addLanguagePart = TRUE,
$removeLanguagePart = FALSE
) {
- $config = &CRM_Core_Config::singleton();
- return $config->userSystem->languageNegotiationURL($url, $addLanguagePart, $removeLanguagePart);
+ return CRM_Core_Config::singleton()->userSystem->languageNegotiationURL($url, $addLanguagePart, $removeLanguagePart);
}
/**
/**
* Append Backdrop CSS and JS to coreResourcesList.
*
- * @param array $list
+ * @param \Civi\Core\Event\GenericHookEvent $e
*/
- public function appendCoreResources(&$list) {
- $list[] = 'css/backdrop.css';
- $list[] = 'js/crm.backdrop.js';
+ public function appendCoreResources(\Civi\Core\Event\GenericHookEvent $e) {
+ $e->list[] = 'css/backdrop.css';
+ $e->list[] = 'js/crm.backdrop.js';
}
}
}
$out = $content;
- $config = &CRM_Core_Config::singleton();
if (
!$print &&
- $config->userFramework == 'WordPress'
+ CRM_Core_Config::singleton()->userFramework == 'WordPress'
) {
if (!function_exists('is_admin')) {
throw new \Exception('Function "is_admin()" is missing, even though WordPress is the user framework.');
/**
* Append to coreResourcesList.
*
- * @param array $list
+ * @param \Civi\Core\Event\GenericHookEvent $e
*/
- public function appendCoreResources(&$list) {
+ public function appendCoreResources(\Civi\Core\Event\GenericHookEvent $e) {
+ }
+
+ /**
+ * Modify dynamic assets.
+ *
+ * @param \Civi\Core\Event\GenericHookEvent $e
+ */
+ public function alterAssetUrl(\Civi\Core\Event\GenericHookEvent $e) {
}
/**
) {
$query = html_entity_decode($query);
+ $config = CRM_Core_Config::singleton();
+ $base = $absolute ? $config->userFrameworkBaseURL : 'internal:/';
+
$url = \Drupal\civicrm\CivicrmHelper::parseURL("{$path}?{$query}");
// Not all links that CiviCRM generates are Drupal routes, so we use the weaker ::fromUri method.
try {
- $url = \Drupal\Core\Url::fromUri("base:{$url['path']}", [
+ $url = \Drupal\Core\Url::fromUri("{$base}{$url['path']}", array(
'query' => $url['query'],
'fragment' => $fragment,
'absolute' => $absolute,
- ])->toString();
+ ))->toString();
}
catch (Exception $e) {
- // @Todo: log to watchdog
- $url = '';
+ \Drupal::logger('civicrm')->error($e->getMessage());
}
// Special case: CiviCRM passes us "*path*?*query*" as a skeleton, but asterisks
*/
public function getCurrentLanguage() {
// Drupal might not be bootstrapped if being called by the REST API.
- if (!class_exists('Drupal')) {
+ if (!class_exists('Drupal') || !\Drupal::hasContainer()) {
return NULL;
}
/**
* Append Drupal8 js to coreResourcesList.
*
- * @param array $list
+ * @param \Civi\Core\Event\GenericHookEvent $e
+ */
+ public function appendCoreResources(\Civi\Core\Event\GenericHookEvent $e) {
+ $e->list[] = 'js/crm.drupal8.js';
+ }
+
+ /**
+ * @inheritDoc
*/
- public function appendCoreResources(&$list) {
- $list[] = 'js/crm.drupal8.js';
+ public function setUFLocale($civicrm_language) {
+ $langcode = substr(str_replace('_', '', $civicrm_language), 0, 2);
+ $languageManager = \Drupal::languageManager();
+ $languages = $languageManager->getLanguages();
+
+ if (isset($languages[$langcode])) {
+ $languageManager->setConfigOverrideLanguage($languages[$langcode]);
+
+ // Config must be re-initialized to reset the base URL
+ // otherwise links will have the wrong language prefix/domain.
+ $config = CRM_Core_Config::singleton();
+ $config->free();
+
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function languageNegotiationURL($url, $addLanguagePart = TRUE, $removeLanguagePart = FALSE) {
+ if (empty($url)) {
+ return $url;
+ }
+
+ // Drupal might not be bootstrapped if being called by the REST API.
+ if (!class_exists('Drupal') || !\Drupal::hasContainer()) {
+ return NULL;
+ }
+
+ $language = $this->getCurrentLanguage();
+ if (\Drupal::service('module_handler')->moduleExists('language')) {
+ $config = \Drupal::config('language.negotiation')->get('url');
+
+ //does user configuration allow language
+ //support from the URL (Path prefix or domain)
+ $enabledLanguageMethods = \Drupal::config('language.types')->get('negotiation.language_interface.enabled') ?: [];
+ if (array_key_exists(\Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl::METHOD_ID, $enabledLanguageMethods)) {
+ $urlType = $config['source'];
+
+ //url prefix
+ if ($urlType == \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl::CONFIG_PATH_PREFIX) {
+ if (!empty($language)) {
+ if ($addLanguagePart && !empty($config['prefixes'][$language])) {
+ $url .= $config['prefixes'][$language] . '/';
+ }
+ if ($removeLanguagePart) {
+ $url = str_replace("/" . $config['prefixes'][$language] . "/", '/', $url);
+ }
+ }
+ }
+ //domain
+ if ($urlType == \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl::CONFIG_DOMAIN) {
+ if (isset($language->domain) && $language->domain) {
+ if ($addLanguagePart) {
+ $url = (CRM_Utils_System::isSSL() ? 'https' : 'http') . '://' . $config['domains'][$language] . base_path();
+ }
+ if ($removeLanguagePart && defined('CIVICRM_UF_BASEURL')) {
+ $url = str_replace('\\', '/', $url);
+ $parseUrl = parse_url($url);
+
+ //kinda hackish but not sure how to do it right
+ //hope http_build_url() will help at some point.
+ if (is_array($parseUrl) && !empty($parseUrl)) {
+ $urlParts = explode('/', $url);
+ $hostKey = array_search($parseUrl['host'], $urlParts);
+ $ufUrlParts = parse_url(CIVICRM_UF_BASEURL);
+ $urlParts[$hostKey] = $ufUrlParts['host'];
+ $url = implode('/', $urlParts);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return $url;
}
}
$instance->login($params);
}
+ // Save details in Joomla session
+ $user = JFactory::getUser($uid);
+ $jsession = JFactory::getSession();
+ $jsession->set('user', $user);
+
+ // Save details in Civi session
$session = CRM_Core_Session::singleton();
$session->set('ufID', $uid);
$session->set('userID', $contactID);
}
}
- /**
- * Append Joomla js to coreResourcesList.
- *
- * @param array $list
- */
- public function appendCoreResources(&$list) {
- $list[] = 'js/crm.joomla.js';
- }
-
/**
* @inheritDoc
*/
$name = CRM_Utils_Array::value('name', $params);
$pass = CRM_Utils_Array::value('pass', $params);
- if (isset($params['uid'])) {
- throw new \RuntimeException("Not implemented WordPress::loadBootStrap([uid=>\$num]))");
- }
if (!defined('WP_USE_THEMES')) {
define('WP_USE_THEMES', FALSE);
CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone();
}
require_once $cmsRootPath . DIRECTORY_SEPARATOR . 'wp-includes/pluggable.php';
- $uid = CRM_Utils_Array::value('uid', $name);
+ $uid = CRM_Utils_Array::value('uid', $params);
if (!$uid) {
$name = $name ? $name : trim(CRM_Utils_Array::value('name', $_REQUEST));
$pass = $pass ? $pass : trim(CRM_Utils_Array::value('pass', $_REQUEST));
/**
* Append WP js to coreResourcesList.
*
- * @param array $list
+ * @param \Civi\Core\Event\GenericHookEvent $e
*/
- public function appendCoreResources(&$list) {
- $list[] = 'js/crm.wordpress.js';
+ public function appendCoreResources(\Civi\Core\Event\GenericHookEvent $e) {
+ $e->list[] = 'js/crm.wordpress.js';
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function alterAssetUrl(\Civi\Core\Event\GenericHookEvent $e) {
+ // Set menubar breakpoint to match WP admin theme
+ if ($e->asset == 'crm-menubar.css') {
+ $e->params['breakpoint'] = 783;
+ }
}
/**
return strtolower(\CRM_Utils_String::munge($action));
}
+ public static function getNextId() {
+ return self::$nextId++;
+ }
+
}
/**
* Date filter -- the field name.
- * @var string|NULL
+ * @var string|null
* Ex: 'event_start_date'
*/
private $entity_date_start;
/**
* Date filter -- the field name.
- * @var string|NULL
+ * @var string|null
* Ex: 'event_end_date'.
*/
private $entity_date_end;
protected $modules;
/**
- * @var array|NULL
+ * @var array|null
*/
protected $crmApp = NULL;
protected $res = NULL;
/**
- * @var array|NULL
+ * Modules.
+ *
+ * @var array|null
* Each item has some combination of these keys:
* - ext: string
* The Civi extension which defines the Angular module.
/**
* The region of the page into which JavaScript will be loaded.
*
- * @var String
+ * @var string
* @deprecated
*/
public $region;
* Ex: 'http://example.org/files/civicrm/dyn/angular.abcd1234abcd1234.json'.
*/
public function getUrl($name, $params = []) {
+ \CRM_Utils_Hook::getAssetUrl($name, $params);
+
if (!$this->isValidName($name)) {
throw new \RuntimeException("Invalid dynamic asset name");
}
$dispatcher->addListener('hook_civicrm_buildAsset', ['\CRM_Utils_VisualBundle', 'buildAssetJs']);
$dispatcher->addListener('hook_civicrm_buildAsset', ['\CRM_Utils_VisualBundle', 'buildAssetCss']);
$dispatcher->addListener('hook_civicrm_buildAsset', ['\CRM_Core_Resources', 'renderMenubarStylesheet']);
+ $dispatcher->addListener('hook_civicrm_coreResourceList', ['\CRM_Utils_System', 'appendCoreResources']);
+ $dispatcher->addListener('hook_civicrm_getAssetUrl', ['\CRM_Utils_System', 'alterAssetUrl']);
$dispatcher->addListener('civi.dao.postInsert', ['\CRM_Core_BAO_RecurringEntity', 'triggerInsert']);
$dispatcher->addListener('civi.dao.postUpdate', ['\CRM_Core_BAO_RecurringEntity', 'triggerUpdate']);
$dispatcher->addListener('civi.dao.postDelete', ['\CRM_Core_BAO_RecurringEntity', 'triggerDelete']);
* The result of combining default values, mandatory
* values, and user values.
*
- * @var array|NULL
+ * @var array|null
* Array(string $settingName => mixed $value).
*/
protected $combined;
protected $bagsByContact = [];
/**
- * @var array|NULL
+ * @var array|null
* Array(string $entity => array(string $settingName => mixed $value)).
* Ex: $mandatory['domain']['uploadDir'].
* NULL means "autoload from $civicrm_setting".
*/
class SettingsMetadata {
- const ALL = 'all';
-
/**
* WARNING: This interface may change.
*
*
* @param array $filters
* @param int $domainID
+ * @param bool $loadOptions
*
* @return array
* the following information as appropriate for each setting
* - is_contact
* - description
* - help_text
+ * - options
+ * - pseudoconstant
*/
- public static function getMetadata($filters = [], $domainID = NULL) {
+ public static function getMetadata($filters = [], $domainID = NULL, $loadOptions = FALSE) {
if ($domainID === NULL) {
$domainID = \CRM_Core_Config::domainID();
}
$cache = \Civi::cache('settings');
$cacheString = 'settingsMetadata_' . $domainID . '_';
- // the caching into 'All' seems to be a duplicate of caching to
- // settingsMetadata__ - I think the reason was to cache all settings as defined & then those altered by a hook
$settingsMetadata = $cache->get($cacheString);
- $cached = is_array($settingsMetadata);
-
- if (!$cached) {
- $settingsMetadata = $cache->get(self::ALL);
- if (empty($settingsMetadata)) {
- global $civicrm_root;
- $metaDataFolders = [$civicrm_root . '/settings'];
- \CRM_Utils_Hook::alterSettingsFolders($metaDataFolders);
- $settingsMetadata = self::loadSettingsMetaDataFolders($metaDataFolders);
- $cache->set(self::ALL, $settingsMetadata);
- }
- }
-
- \CRM_Utils_Hook::alterSettingsMetaData($settingsMetadata, $domainID, NULL);
- if (!$cached) {
+ if (!is_array($settingsMetadata)) {
+ global $civicrm_root;
+ $metaDataFolders = [$civicrm_root . '/settings'];
+ \CRM_Utils_Hook::alterSettingsFolders($metaDataFolders);
+ $settingsMetadata = self::loadSettingsMetaDataFolders($metaDataFolders);
+ \CRM_Utils_Hook::alterSettingsMetaData($settingsMetadata, $domainID, NULL);
$cache->set($cacheString, $settingsMetadata);
}
self::_filterSettingsSpecification($filters, $settingsMetadata);
+ if ($loadOptions) {
+ self::loadOptions($settingsMetadata);
+ }
return $settingsMetadata;
}
* Metadata to filter.
*/
protected static function _filterSettingsSpecification($filters, &$settingSpec) {
- if (empty($filters)) {
- return;
- }
- elseif (array_keys($filters) == ['name']) {
- $settingSpec = [$filters['name'] => \CRM_Utils_Array::value($filters['name'], $settingSpec, '')];
- return;
+ if (!empty($filters['name'])) {
+ $settingSpec = array_intersect_key($settingSpec, array_flip((array) $filters['name']));
+ // FIXME: This is a workaround for settingsBag::setDb() called by unit tests with settings names that don't exist
+ $settingSpec += array_fill_keys((array) $filters['name'], []);
+ unset($filters['name']);
}
- else {
+ if (!empty($filters)) {
foreach ($settingSpec as $field => $fieldValues) {
if (array_intersect_assoc($fieldValues, $filters) != $filters) {
unset($settingSpec[$field]);
}
}
- return;
+ }
+ }
+
+ /**
+ * Retrieve options from settings metadata
+ *
+ * @param array $settingSpec
+ */
+ protected static function loadOptions(&$settingSpec) {
+ foreach ($settingSpec as &$spec) {
+ if (empty($spec['pseudoconstant'])) {
+ continue;
+ }
+ // It would be nice if we could leverage CRM_Core_PseudoConstant::get() somehow,
+ // but it's tightly coupled to DAO/field. However, if you really need to support
+ // more pseudoconstant types, then probably best to refactor it. For now, KISS.
+ if (!empty($spec['pseudoconstant']['callback'])) {
+ $spec['options'] = Resolver::singleton()->call($spec['pseudoconstant']['callback'], []);
+ }
+ elseif (!empty($spec['pseudoconstant']['optionGroupName'])) {
+ $keyColumn = \CRM_Utils_Array::value('keyColumn', $spec['pseudoconstant'], 'value');
+ $spec['options'] = \CRM_Core_OptionGroup::values($spec['pseudoconstant']['optionGroupName'], FALSE, FALSE, TRUE, NULL, 'label', TRUE, FALSE, $keyColumn);
+ }
}
}
/**
* The name of the output file.
*
- * @var string|NULL
+ * @var string|null
*/
private $file = NULL;
return $results;
}
+ mysqli_query($conn, 'DROP TABLE IF EXISTS civicrm_utf8mb4_test');
$r = mysqli_query($conn, 'CREATE TABLE civicrm_utf8mb4_test (id VARCHAR(255), PRIMARY KEY(id(255))) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC ENGINE=INNODB');
if (!$r) {
$results['severity'] = $this::REQUIREMENT_WARNING;
mysqli_close($conn);
return $results;
}
- mysqli_query('DROP TABLE civicrm_utf8mb4_test');
+ mysqli_query($conn, 'DROP TABLE civicrm_utf8mb4_test');
// Ensure that the MySQL driver supports utf8mb4 encoding.
$version = mysqli_get_client_info($conn);
private $steps = [];
/**
- * @var string|NULL
+ * @var string|null
* A digest of the values in $steps.
*/
private $targetSignature = NULL;
*
* @return int
* id of Household created
+ * @throws \Exception
*/
public function householdCreate($params = array(), $seq = 0) {
$params = array_merge($this->sampleContact('Household', $seq), $params);
text: ts('Submit final mailing'),
icons: {primary: 'fa-paper-plane'},
click: function() {
- crmMailingMgr.mergeInto(abtest.mailings.c, abtest.mailings[mailingName], [
- 'name',
- 'recipients',
- 'scheduled_date'
- ]);
- crmStatus({start: ts('Saving...'), success: ''}, abtest.save())
- .then(function() {
- return crmStatus({start: ts('Submitting...'), success: ts('Submitted')},
- abtest.submitFinal().then(function(r) {
- delete abtest.$CrmMailingABReportCnt;
- return r;
- }));
- })
- .then(function() {
+ crmStatus({start: ts('Submitting...'), success: ts('Submitted')},
+ abtest.submitFinal(abtest.mailings[mailingName].id).then(function (r) {
+ delete abtest.$CrmMailingABReportCnt;
+ }))
+ .then(function () {
dialogService.close('selectWinnerDialog', abtest);
});
}
// Schedule the final mailing
// @return Promise CrmMailingAB
// Note: Submission may cause the server state to change. Consider abtest.submit().then(...abtest.load()...)
- submitFinal: function submitFinal() {
+ submitFinal: function submitFinal(winner_id) {
var crmMailingAB = this;
var params = {
id: this.ab.id,
status: 'Final',
+ winner_id: winner_id,
approval_date: 'now',
scheduled_date: this.mailings.c.scheduled_date ? this.mailings.c.scheduled_date : 'now'
};
registerGlobalListener($injector);
options.format = options.format || 'json';
- var fmt = formats[options.format];
+ var fmt = _.clone(formats[options.format]);
if (options.deep) {
fmt.watcher = '$watch';
}
if (options.default === undefined) {
options.default = fmt.default;
}
- var _scope = this;
+ var value,
+ _scope = this,
+ $route = $injector.get('$route'),
+ $timeout = $injector.get('$timeout');
- var $route = $injector.get('$route'), $timeout = $injector.get('$timeout');
-
- var value;
if (options.param in $route.current.params) {
value = fmt.decode($route.current.params[options.param]);
}
// Keep the URL bar up-to-date.
_scope[fmt.watcher](options.expr, function (newValue) {
var encValue = fmt.encode(newValue);
- if ($route.current.params[options.param] === encValue) return;
+ if (!_.isEqual(newValue, options.default) && $route.current.params[options.param] === encValue) {
+ return;
+ }
pendingUpdates = pendingUpdates || {};
pendingUpdates[options.param] = encValue;
var p = angular.extend({}, $route.current.params, pendingUpdates);
- angular.forEach(ignorable, function(v,k){ if (p[k] === v) delete p[k]; });
+
+ angular.forEach(ignorable, function(v, k) {
+ if (p[k] === v) {
+ delete p[k];
+ }
+ });
+
+ // Remove params from url if they equal their defaults
+ if (_.isEqual(newValue, options.default)) {
+ p[options.param] = null;
+ }
+
$route.updateParams(p);
if (activeTimer) $timeout.cancel(activeTimer);
function civicrm_api3_activity_get($params) {
$options = _civicrm_api3_get_options_from_params($params, FALSE, 'Activity', 'get');
$sql = CRM_Utils_SQL_Select::fragment();
+ _civicrm_activity_get_handleSourceContactNameOrderBy($params, $options, $sql);
_civicrm_api3_activity_get_extraFilters($params, $sql);
return civicrm_api3_create_success($activities, $params, 'Activity', 'get');
}
+/**
+ * Handle source_contact_name as a sort parameter.
+ *
+ * This is passed from the activity selector - e.g search results or contact tab.
+ *
+ * It's a non-standard handling but this api already handles variations on handling source_contact
+ * as a filter & as a field so it's in keeping with that. Source contact has a one-one relationship
+ * with activity table.
+ *
+ * Test coverage in CRM_Activity_BAO_ActivtiyTest::testGetActivitiesforContactSummaryWithSortOptions
+ *
+ * @param array $params
+ * @param array $options
+ * @param CRM_Utils_SQL_Select $sql
+ */
+function _civicrm_activity_get_handleSourceContactNameOrderBy(&$params, &$options, $sql) {
+ $sourceContactID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Source');
+ if (!empty($options['sort']) && in_array($options['sort'], [
+ 'source_contact_name',
+ 'source_contact_name desc',
+ 'source_contact_name asc'
+ ])) {
+ $order = substr($options['sort'], -4) === 'desc' ? 'desc' : 'asc';
+ $sql->join(
+ 'source_contact',
+ "LEFT JOIN
+ civicrm_activity_contact ac ON (ac.activity_id = a.id AND record_type_id = #sourceContactID)
+ LEFT JOIN civicrm_contact c ON c.id = ac.contact_id",
+ ['sourceContactID' => $sourceContactID]
+ );
+ $sql->orderBy("c.display_name $order");
+ unset($options['sort'], $params['options']['sort']);
+ }
+}
+
/**
* Support filters beyond what basic_get can do.
*
'activity_id',
'record_type_id',
'contact_id.display_name',
+ 'contact_id.sort_name',
'contact_id',
],
+ 'options' => ['limit' => 0],
'check_permissions' => !empty($params['check_permissions']),
];
if (count($activityContactTypes) < 3) {
if (in_array($recordType, ['target', 'assignee'])) {
$activities[$activityContact['activity_id']][$recordType . '_contact_id'][] = $contactID;
$activities[$activityContact['activity_id']][$recordType . '_contact_name'][$contactID] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : '';
+ $activities[$activityContact['activity_id']][$recordType . '_contact_sort_name'][$contactID] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : '';
}
else {
$activities[$activityContact['activity_id']]['source_contact_id'] = $contactID;
$activities[$activityContact['activity_id']]['source_contact_name'] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : '';
+ $activities[$activityContact['activity_id']]['source_contact_sort_name'] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : '';
}
}
}
// Validate 'context' from params
$context = CRM_Utils_Array::value('context', $apiRequest['params']);
CRM_Core_DAO::buildOptionsContext($context);
- unset($apiRequest['params']['context'], $apiRequest['params']['field']);
+ unset($apiRequest['params']['context'], $apiRequest['params']['field'], $apiRequest['params']['condition']);
$baoName = _civicrm_api3_get_BAO($apiRequest['entity']);
$options = $baoName::buildOptions($fieldName, $context, $apiRequest['params']);
$returnProperties = $mailing->getReturnProperties();
$contactID = CRM_Utils_Array::value('contact_id', $params);
if (!$contactID) {
- $contactID = $session->get('userID');
+ // If we still don't have a userID in a session because we are annon then set contactID to be 0
+ $contactID = empty($session->get('userID')) ? 0 : $session->get('userID');
}
$mailingParams = ['contact_id' => $contactID];
- $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
+ if (!$contactID) {
+ $details = CRM_Utils_Token::getAnonymousTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
+ $details = CRM_Utils_Array::value(0, $details[0]);
+ }
+ else {
+ $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
+ $details = $details[0][$contactID];
+ }
- $mime = $mailing->compose(NULL, NULL, NULL, $session->get('userID'), $fromEmail, $fromEmail,
- TRUE, $details[0][$contactID], $attachments
+ $mime = $mailing->compose(NULL, NULL, NULL, $contactID, $fromEmail, $fromEmail,
+ TRUE, $details, $attachments
);
return civicrm_api3_create_success([
- 'id' => $params['id'],
+ 'id' => $mailingID,
'contact_id' => $contactID,
'subject' => $mime->headers()['Subject'],
'body_html' => $mime->getHTMLBody(),
$spec['approval_date'] = $mailingFields['approval_date'];
$spec['approval_status_id'] = $mailingFields['approval_status_id'];
$spec['approval_note'] = $mailingFields['approval_note'];
+ $spec['winner_id'] = [
+ 'name' => 'winner_id',
+ 'type' => 1,
+ 'title' => 'Winner ID',
+ 'description' => 'The experimental mailing with the best results. If specified, values are copied to the final mailing.',
+ 'localizable' => 0,
+ ];
// Note: we'll pass through approval_* fields to the underlying mailing, but they may be ignored
// if the user doesn't have suitable permission. If separate approvals are required, they must be provided
// outside the A/B Test UI.
if ($dao->status != 'Testing') {
throw new API_Exception("Cannot transition to state 'Final'");
}
+ if (!empty($params['winner_id'])) {
+ _civicrm_api3_mailing_a_b_fill_winner($params['winner_id'], $dao->mailing_id_c);
+ }
civicrm_api3('Mailing', 'submit', $submitParams + [
'id' => $dao->mailing_id_c,
'_skip_evil_bao_auto_recipients_' => 1,
]);
}
+/**
+ * @param int $winner_id
+ * The experimental mailing chosen as the "winner".
+ * @param int $final_id
+ * The final mailing which should imitate the "winner".
+ * @throws \API_Exception
+ */
+function _civicrm_api3_mailing_a_b_fill_winner($winner_id, $final_id) {
+ $copyFields = [
+ // 'id',
+ // 'name',
+ 'campaign_id',
+ 'from_name',
+ 'from_email',
+ 'replyto_email',
+ 'subject',
+ 'dedupe_email',
+ // 'recipients',
+ 'body_html',
+ 'body_text',
+ 'footer_id',
+ 'header_id',
+ 'visibility',
+ 'url_tracking',
+ 'dedupe_email',
+ 'forward_replies',
+ 'auto_responder',
+ 'open_tracking',
+ 'override_verp',
+ 'optout_id',
+ 'reply_id',
+ 'resubscribe_id',
+ 'unsubscribe_id'
+ ];
+ $f = CRM_Utils_SQL_Select::from('civicrm_mailing')
+ ->where('id = #id', ['id' => $winner_id])
+ ->select($copyFields)
+ ->execute()
+ ->fetchAll();
+ if (count($f) !== 1) {
+ throw new API_Exception('Invalid winner_id');
+ }
+ foreach ($f as $winner) {
+ civicrm_api3('Mailing', 'create', $winner + [
+ 'id' => $final_id,
+ '_skip_evil_bao_auto_recipients_' => 1,
+ ]);
+ }
+}
+
/**
* Adjust Metadata for graph_stats action.
*
'financial_trxn_id' => $params['id'],
];
$entity = civicrm_api3('EntityFinancialTrxn', 'getsingle', $eftParams);
- $contributionId = $entity['entity_id'];
- $params['total_amount'] = $entity['amount'];
- unset($params['id']);
- $trxn = CRM_Contribute_BAO_Contribution::recordAdditionalPayment($contributionId, $params, 'refund', NULL, FALSE);
+ $paymentParams = [
+ 'total_amount' => -$entity['amount'],
+ 'contribution_id' => $entity['entity_id'],
+ 'trxn_date' => CRM_Utils_Array::value('trxn_date', $params, 'now'),
+ ];
- $values = [];
- _civicrm_api3_object_to_array_unique_fields($trxn, $values[$trxn->id]);
- return civicrm_api3_create_success($values, $params, 'Payment', 'cancel', $trxn);
+ foreach (['trxn_id', 'payment_instrument_id'] as $permittedParam) {
+ if (isset($params[$permittedParam])) {
+ $paymentParams[$permittedParam] = $params[$permittedParam];
+ }
+ }
+ $result = civicrm_api3('Payment', 'create', $paymentParams);
+ return civicrm_api3_create_success($result['values'], $params, 'Payment', 'cancel');
}
/**
'type' => CRM_Utils_Type::T_INT,
'api.aliases' => ['payment_id'],
],
+ 'trxn_date' => [
+ 'title' => 'Cancel Date',
+ 'type' => CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME,
+ ],
];
}
'type' => CRM_Utils_Type::T_INT,
'api.aliases' => ['payment_id'],
],
+ 'trxn_date' => [
+ 'title' => 'Cancel Date',
+ 'type' => CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME,
+ ],
];
}
* @throws \API_Exception
*/
function civicrm_api3_setting_getoptions($params) {
- $specs = CRM_Core_BAO_Setting::getSettingSpecification();
+ $domainId = CRM_Utils_Array::value('domain_id', $params);
+ $specs = \Civi\Core\SettingsMetadata::getMetadata(['name' => $params['field']], $domainId, TRUE);
- if (empty($specs[$params['field']]) || empty($specs[$params['field']]['pseudoconstant'])) {
+ if (empty($specs[$params['field']]) || !is_array(CRM_Utils_Array::value('options', $specs[$params['field']]))) {
throw new API_Exception("The field '" . $params['field'] . "' has no associated option list.");
}
- $pseudoconstant = $specs[$params['field']]['pseudoconstant'];
-
- // It would be nice if we could leverage CRM_Core_PseudoConstant::get() somehow,
- // but it's tightly coupled to DAO/field. However, if you really need to support
- // more pseudoconstant types, then probably best to refactor it. For now, KISS.
- if (!empty($pseudoconstant['callback'])) {
- $values = Civi\Core\Resolver::singleton()->call($pseudoconstant['callback'], []);
- return civicrm_api3_create_success($values, $params, 'Setting', 'getoptions');
- }
- elseif (!empty($pseudoconstant['optionGroupName'])) {
- $keyColumn = 'value';
- if (!empty($pseudoconstant['keyColumn'])) {
- $keyColumn = $pseudoconstant['keyColumn'];
- }
- return civicrm_api3_create_success(
- CRM_Core_OptionGroup::values($pseudoconstant['optionGroupName'], FALSE, FALSE, TRUE, NULL, 'label', TRUE, FALSE, $keyColumn),
- $params, 'Setting', 'getoptions'
- );
- }
-
- throw new API_Exception("The field '" . $params['field'] . "' uses an unsupported option list.");
+ return civicrm_api3_create_success($specs[$params['field']]['options'], $params, 'Setting', 'getoptions');
}
/**
return;
}
+ // Hack for Profile formatting fields
+ if ($fieldName === 'field_name' && (strpos($value, 'formatting') === 0)) {
+ return;
+ }
+
// Translate value into key
// Cast $value to string to avoid a bug in array_search
$newValue = array_search((string) $value, $options);
// of this script
array_shift($args);
- while (list($k, $arg) = each($args)) {
+ foreach ($args as $k => $arg) {
// sanitize all user input
$arg = $this->_sanitize($arg);
"d3-3.5.x": "d3#~3.5.17",
"dc-2.1.x": "dc.js#~2.1.8",
"crossfilter-1.3.x": "crossfilter2#~1.3.11",
- "jquery": "~1.12",
+ "jquery": "civicrm/jquery#1.12.4-civicrm-1.1",
"jquery-ui": "~1.12",
"lodash-compat": "~3.0",
"google-code-prettify": "~1.0",
"es6-promise": "^4.2.4"
},
"resolutions": {
- "angular": "~1.5.11"
+ "angular": "~1.5.11",
+ "jquery": "1.12.4-civicrm-1.1"
}
}
"psr/simple-cache": "~1.0.1",
"cweagans/composer-patches": "~1.0",
"pear/log": "1.13.1",
- "ezyang/htmlpurifier": "4.10"
+ "katzien/php-mime-type": "2.1.0"
},
"scripts": {
"post-install-cmd": [
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "93a9f686f7eb00fb9d766d262eedb09b",
+ "content-hash": "a786aecfcc51b68f1ebafb0f43f99d08",
"packages": [
{
"name": "civicrm/civicrm-cxn-rpc",
"homepage": "http://code.google.com/p/phpquery/",
"time": "2013-03-21T12:39:33+00:00"
},
- {
- "name": "ezyang/htmlpurifier",
- "version": "v4.10.0",
- "source": {
- "type": "git",
- "url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "d85d39da4576a6934b72480be6978fb10c860021"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/d85d39da4576a6934b72480be6978fb10c860021",
- "reference": "d85d39da4576a6934b72480be6978fb10c860021",
- "shasum": ""
- },
- "require": {
- "php": ">=5.2"
- },
- "require-dev": {
- "simpletest/simpletest": "^1.1"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "HTMLPurifier": "library/"
- },
- "files": [
- "library/HTMLPurifier.composer.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL"
- ],
- "authors": [
- {
- "name": "Edward Z. Yang",
- "email": "admin@htmlpurifier.org",
- "homepage": "http://ezyang.com"
- }
- ],
- "description": "Standards compliant HTML filter written in PHP",
- "homepage": "http://htmlpurifier.org/",
- "keywords": [
- "html"
- ],
- "time": "2018-02-23T01:58:20+00:00"
- },
{
"name": "guzzlehttp/guzzle",
"version": "6.3.0",
],
"time": "2017-03-20T17:10:46+00:00"
},
+ {
+ "name": "katzien/php-mime-type",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/katzien/PhpMimeType.git",
+ "reference": "159dfbdcd5906442f3dad89951127f0b9dfa3b78"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/katzien/PhpMimeType/zipball/159dfbdcd5906442f3dad89951127f0b9dfa3b78",
+ "reference": "159dfbdcd5906442f3dad89951127f0b9dfa3b78",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "5.*",
+ "satooshi/php-coveralls": "1.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "MimeType\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kat Zien"
+ }
+ ],
+ "description": "A PHP library to detect the mime type of files.",
+ "homepage": "https://github.com/katzien/PhpMimeType",
+ "keywords": [
+ "mimetype",
+ "php"
+ ],
+ "time": "2017-03-23T02:05:33+00:00"
+ },
{
"name": "marcj/topsort",
"version": "1.1.0",
},
{
"name": "tecnickcom/tcpdf",
- "version": "6.2.13",
+ "version": "6.2.26",
"source": {
"type": "git",
"url": "https://github.com/tecnickcom/TCPDF.git",
- "reference": "95c5938aafe4b20df1454dbddb3e5005c0b26f64"
+ "reference": "367241059ca166e3a76490f4448c284e0a161f15"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/95c5938aafe4b20df1454dbddb3e5005c0b26f64",
- "reference": "95c5938aafe4b20df1454dbddb3e5005c0b26f64",
+ "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/367241059ca166e3a76490f4448c284e0a161f15",
+ "reference": "367241059ca166e3a76490f4448c284e0a161f15",
"shasum": ""
},
"require": {
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPLv3"
+ "LGPL-3.0"
],
"authors": [
{
"name": "Nicola Asuni",
"email": "info@tecnick.com",
- "homepage": "http://nicolaasuni.tecnick.com"
+ "role": "lead"
}
],
"description": "TCPDF is a PHP class for generating PDF documents and barcodes.",
"pdf417",
"qrcode"
],
- "time": "2017-04-26T08:14:48+00:00"
+ "time": "2018-10-16T17:24:05+00:00"
},
{
"name": "totten/ca-config",
- github : demeritcowboy
name : Dave D
- jira : demeritcowboy
+ jira : Dave D
- github : dereklewis123
name : Derek Lewis
organization: Greenleaf Advancement
jira : guyiac
+- github : GValFr35
+
+- github : kewljuice
+ name : Wouter Hechtermans
+ organization: Calibrate
+
+- github : khorporative
+ name : Aivars
+
- github : h-c-c
name : Peter Hartmann
organization: Hartmann Computer Consulting
- github : pfigel
name : Patrick Figel
- organization: GreenPeace Central and Eastern Europe
+ organization: Greenpeace CEE
- github : philmck
name : Phil McKerracher
organization: Web Access
jira : pratiksha
+- github : prondubuisi
+ name : Onyemenam Ndubuisi
+
- name : Richard Edgar
jira : redgar
border: 1px solid #ccc;
margin: 4px 4px 0;
padding: 2px 8px;
- height: 30px;
+ height: calc($menubarHeight - 10px);
width: 30px;
transition: width .5s .05s, background-color .3s .05s;
color: black;
transform: rotate(180deg);
}
-@media (min-width: 768px) {
+@media (min-width: $breakMin) {
/* Switch to desktop layout
-----------------------------------------------
}
#civicrm-menu li a {
- background-color: $semiTransparentMenuColor;
+ background-color: $menuItemColor;
color: $textColor;
}
#civicrm-menu > li > a {
- height: 40px;
+ height: $menubarHeight;
+ padding: 0 8px;
+ }
+
+ #civicrm-menu > li > a > * {
+ vertical-align: middle;
+ }
+
+ /* Pseudo-element to ensure vertical alignment */
+ #civicrm-menu > li > a:after {
+ content: '';
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
}
#civicrm-menu > li > a.highlighted {
}
}
-@media (max-width: 768px) {
+@media (max-width: $breakMax) {
/* hide the menu in mobile view */
#crm-menubar-state:not(:checked) ~ #civicrm-menu {
display: none;
body.admin.com_civicrm #content-right {
padding: 12px;
}
+
+/* Make footer admin bar hide behind popup windows (CRM-15723) */
+body.ui-dialog-open #status {
+ z-index: 100 !important;
+}
-@media (min-width: 768px) {
+@media (min-width: $breakMin) {
body.crm-menubar-visible.crm-menubar-over-cms-menu {
border-top: 0 none !important;
- margin-top: 40px;
+ margin-top: $menubarHeight;
}
body.crm-menubar-visible.crm-menubar-over-cms-menu.crm-menubar-wrapped {
- margin-top: 80px;
+ margin-top: calc($menubarHeight * 2);
}
body.crm-menubar-visible.crm-menubar-over-cms-menu #admin-bar {
visibility: hidden;
}
}
-@media (max-width: 768px) {
+@media (max-width: $breakMax) {
body.backdrop-admin-bar-position-absolute #civicrm-menu-nav {
position: absolute;
-@media (min-width: 768px) {
+@media (min-width: $breakMin) {
body.crm-menubar-visible.crm-menubar-over-cms-menu #toolbar {
display: none;
}
body.crm-menubar-visible.crm-menubar-over-cms-menu {
- padding-top: 40px !important;
+ padding-top: $menubarHeight !important;
}
body.crm-menubar-visible.crm-menubar-over-cms-menu.crm-menubar-wrapped {
- padding-top: 80px !important;
+ padding-top: calc($menubarHeight * 2) !important;
}
body.crm-menubar-visible.crm-menubar-over-cms-menu #toolbar .toolbar-drawer {
min-height: 30px;
}
body.crm-menubar-visible.crm-menubar-below-cms-menu.admin-menu {
- padding-top: 40px !important;
+ padding-top: $menubarHeight !important;
}
body.crm-menubar-visible.crm-menubar-below-cms-menu.crm-menubar-wrapped.admin-menu {
- padding-top: 80px !important;
+ padding-top: calc($menubarHeight * 2) !important;
}
body.crm-menubar-visible.crm-menubar-over-cms-menu #admin-menu {
display: none;
}
/* For adminimal_admin_menu */
-@media (min-width: 768px) and (max-width: 1024px) {
+@media (min-width: $breakMin) and (max-width: 1024px) {
body.crm-menubar-visible.crm-menubar-over-cms-menu.admin-menu.adminimal-menu > .slicknav_menu {
display: none;
}
}
-@media (max-width: 768px) {
+@media (max-width: $breakMax) {
body.toolbar.crm-menubar-visible #toolbar-home {
visibility: hidden;
left: 44px;
}
-@media (min-width: 768px) {
+@media (min-width: $breakMin) {
- body.crm-menubar-visible.crm-menubar-over-cms-menu #toolbar-administration {
+ body.crm-menubar-visible.crm-menubar-over-cms-menu #toolbar-administration {
display: none;
}
body.crm-menubar-visible.crm-menubar-over-cms-menu {
- padding-top: 40px !important;
+ padding-top: $menubarHeight !important;
}
- body.crm-menubar-visible.crm-menubar-over-cms-menu.crm-menubar-wrapped,
+ body.crm-menubar-visible.crm-menubar-over-cms-menu.crm-menubar-wrapped {
+ padding-top: calc($menubarHeight * 2) !important;
+ }
+ /* The Drupal menu is 40px tall so we add that to our menubar height */
body.crm-menubar-visible.crm-menubar-below-cms-menu {
- padding-top: 80px !important;
+ padding-top: calc($menubarHeight + 40px) !important;
}
body.crm-menubar-visible.crm-menubar-below-cms-menu.crm-menubar-wrapped {
- padding-top: 120px !important;
+ padding-top: calc($menubarHeight * 2 + 40px) !important;
}
body.crm-menubar-below-cms-menu > #civicrm-menu-nav ul#civicrm-menu {
-@media (min-width: 768px) {
+@media (min-width: $breakMin) {
body.crm-menubar-over-cms-menu.crm-menubar-visible {
- padding-top: 40px;
+ padding-top: $menubarHeight;
}
body.crm-menubar-over-cms-menu.crm-menubar-visible.crm-menubar-wrapped {
- padding-top: 80px;
+ padding-top: calc($menubarHeight * 2);
}
body.crm-menubar-below-cms-menu.crm-menubar-visible {
- margin-top: 40px;
+ margin-top: $menubarHeight;
}
body.crm-menubar-below-cms-menu.crm-menubar-visible.crm-menubar-wrapped {
- margin-top: 80px;
+ margin-top: calc($menubarHeight * 2);
}
}
-@media (max-width: 768px) {
+@media (max-width: $breakMax) {
body #civicrm-menu-nav {
position: absolute;
-@media (min-width: 768px) {
+@media (min-width: $breakMin) {
body.crm-menubar-over-cms-menu.crm-menubar-visible #wpbody {
padding-top: 8px;
}
body.crm-menubar-below-cms-menu.crm-menubar-visible #wpbody {
- padding-top: 40px;
+ padding-top: $menubarHeight;
}
body.crm-menubar-below-cms-menu.crm-menubar-visible.crm-menubar-wrapped #wpbody {
- padding-top: 80px;
+ padding-top: calc($menubarHeight * 2);
}
body.crm-menubar-over-cms-menu.crm-menubar-visible.crm-menubar-wrapped #adminmenuwrap {
- margin-top: 40px;
+ margin-top: $menubarHeight;
}
}
-@media (min-width: 768px) and (max-width: 960px) {
+@media (min-width: $breakMin) and (max-width: 960px) {
/* For the auto-fold toolbar */
.wp-toolbar body.crm-menubar-below-cms-menu.auto-fold > #civicrm-menu-nav #civicrm-menu {
}
}
-@media (max-width: 768px) {
+@media (max-width: $breakMax) {
body #civicrm-menu-nav .crm-menubar-toggle-btn {
position: absolute;
}
}
+
+/* Make admin bar hide behind popup windows */
+body.ui-dialog-open #adminmenuwrap {
+ z-index: 100 !important;
+}
* @package CRM
* @copyright CiviCRM LLC (c) 2004-2019
* $Id$
+ *
+ * This script processes "Instant Payment Notifications" (IPNs). Modern
+ * Payment Processors use the /civicrm/payment/ipn/123 endpoint instead (where
+ * 123 is the payment processor ID), however a quirk in the way PayPal works
+ * means that we need to maintain this script.
+ *
+ * Note on PayPal.
+ *
+ * Using PayPal Website Standard (which uses the old PayPal button API) the IPN
+ * endpoint is passed to PayPal with every transaction, and it is then stored
+ * by PayPal who unhelpfully do not give you any way to retrieve or change
+ * this.
+ *
+ * This means that if you provide URL1 when setting up a recurring
+ * contribution, then you will always need to maintain URL1 because all
+ * recurring payments against that will be sent to URL1.
+ *
+ * Note that this also affects you if you were to move your CiviCRM instance to
+ * another domain (if you do, get the webserver at the original domain to emit
+ * a 307 redirect to the new one, PayPal will re-send).
+ *
+ * Therefore, for the sake of these old recurring contributions, CiviCRM should
+ * maintain this script as part of core.
*/
if (defined('PANTHEON_ENVIRONMENT')) {
// @todo upgrade standard per Pro
}
try {
- //CRM-18245
- if ($config->userFramework == 'Joomla') {
- CRM_Utils_System::loadBootStrap();
+ switch ($config->userFramework) {
+ case 'Joomla':
+ // CRM-18245
+ CRM_Utils_System::loadBootStrap();
+ break;
+
+ case 'Drupal':
+ case 'Backdrop':
+ // Gitlab issue: #973
+ CRM_Utils_System::loadBootStrap([], FALSE);
+ break;
+
}
$paypalIPN->main();
}
if (defined('PANTHEON_ENVIRONMENT')) {
ini_set('session.save_handler', 'files');
}
-session_start();
$rest = new CRM_Utils_REST();
// Json-appropriate header will be set by CRM_Utils_Rest
// Set the install type
// this is sent as a query string when the page is first loaded
// and subsequently posted to the page as a hidden field
-if (isset($_POST['civicrm_install_type'])) {
+// only permit acceptable installation types to prevent issues;
+$acceptableInstallTypes = ['drupal', 'wordpress', 'backdrop'];
+if (isset($_POST['civicrm_install_type']) && in_array($_POST['civicrm_install_type'], $acceptableInstallTypes)) {
$installType = $_POST['civicrm_install_type'];
}
-elseif (isset($_GET['civicrm_install_type'])) {
+elseif (isset($_GET['civicrm_install_type']) && in_array(strtolower($_GET['civicrm_install_type']), $acceptableInstallTypes)) {
$installType = strtolower($_GET['civicrm_install_type']);
}
else {
- // default value if not set
+ // default value if not set and not an acceptable install type.
$installType = "drupal";
}
+++ /dev/null
-// http://civicrm.org/licensing
-CRM.$(function($) {
- $(document)
- .on('dialogopen', function(e) {
- // J3 - Make footer admin bar hide behind popup windows (CRM-15723)
- $('#status').css('z-index', '100');
- })
- .on('dialogclose', function(e) {
- if ($('.ui-dialog-content:visible').not(e.target).length < 1) {
- // J3 - restore footer admin bar position (CRM-15723)
- $('#status').css('z-index', '');
- }
- });
-});
})
.on('show.smapi', function(e, menu) {
// Focus menu when opened with an accesskey
- $(menu).siblings('a[accesskey]:not(:hover)').focus();
+ $(menu).siblings('a[accesskey]').focus();
})
.smartmenus(CRM.menubar.settings);
initialized = true;
// http://civicrm.org/licensing
CRM.$(function($) {
$(document)
- .on('dialogopen', function(e) {
- // Make admin bar hide behind popup windows
- $('#adminmenuwrap').css('z-index', '100');
- })
- .on('dialogclose', function(e) {
- if ($('.ui-dialog-content:visible').not(e.target).length < 1) {
- // Restore admin bar position
- $('#adminmenuwrap').css('z-index', '');
- }
- })
.on('crmWysiwygCreate', function(e, type, editor) {
if (type === 'ckeditor') {
editor.on('maximize', function(e) {
});
// Prevent screen reader shortcuts from changing the document hash and breaking angular routes
$('a.screen-reader-shortcut').click(function() {
- var href = $(this).attr('href');
+ var target = $(this).attr('href');
// Show toolbar if hidden
- if (href === '#wp-toolbar' && CRM.menubar.position === 'over-cms-menu') {
+ if (target === '#wp-toolbar' && CRM.menubar.position === 'over-cms-menu') {
CRM.menubar.togglePosition(false);
}
- $(href).focus();
+ $(target).focus();
return false;
});
$('<a href="#crm-qsearch-input" class="screen-reader-shortcut">' + ts("Open CiviCRM Menu") + '</a>')
label: this.getLabel(),
entity_name: this.get('entityName'),
field_type: this.getFieldSchema().civiFieldType,
- // For some reason the 'formatting' field gets a random number appended in core so we mimic that here.
- // TODO: Why?
- field_name: this.get('fieldName') == 'formatting' ? 'formatting_' + (Math.floor(Math.random() * 8999) + 1000) : this.get('fieldName')
+ field_name: this.get('fieldName')
});
return model;
}
# Release Notes
-These release notes are manually compiled from pull requests and Jira issues
+These release notes are manually compiled from pull requests, GitLab and Jira issues
starting with CiviCRM 4.7.14.
Other resources for identifying changes are:
+* The CiviCRM GitLab project management system at https://lab.civicrm.org/groups/dev/-/issues
* The Jira project management system at https://issues.civicrm.org
* The following GitHub projects:
* https://github.com/civicrm/civicrm-core
* https://github.com/civicrm/civicrm-joomla
* https://github.com/civicrm/civicrm-wordpress
+## CiviCRM 5.13.4
+
+Released May 15, 2019
+
+- **[Security advisories](release-notes/5.3.4.md#security)**
+
+## CiviCRM 5.13.3
+
+Released May 14, 2019
+
+- **[Synopsis](release-notes/5.13.3.md#synopsis)**
+- **[Features](release-notes/5.13.3.md#features)**
+- **[Bugs resolved](release-notes/5.13.3.md#bugs)**
+- **[Miscellany](release-notes/5.13.3.md#misc)**
+- **[Credits](release-notes/5.13.3.md#credits)**
+- **[Feedback](release-notes/5.13.3.md#feedback)**
+
+## CiviCRM 5.13.2
+
+Released May 6, 2019
+
+- **[Synopsis](release-notes/5.13.2.md#synopsis)**
+- **[Features](release-notes/5.13.2.md#features)**
+- **[Bugs resolved](release-notes/5.13.2.md#bugs)**
+- **[Miscellany](release-notes/5.13.2.md#misc)**
+- **[Credits](release-notes/5.13.2.md#credits)**
+- **[Feedback](release-notes/5.13.2.md#feedback)**
+
+## CiviCRM 5.13.1
+
+Released May 2, 2019
+
+- **[Synopsis](release-notes/5.13.1.md#synopsis)**
+- **[Features](release-notes/5.13.1.md#features)**
+- **[Bugs resolved](release-notes/5.13.1.md#bugs)**
+- **[Miscellany](release-notes/5.13.1.md#misc)**
+- **[Credits](release-notes/5.13.1.md#credits)**
+- **[Feedback](release-notes/5.13.1.md#feedback)**
+
+## CiviCRM 5.13.0
+
+Released May 1, 2019
+
+- **[Synopsis](release-notes/5.13.0.md#synopsis)**
+- **[Features](release-notes/5.13.0.md#features)**
+- **[Bugs resolved](release-notes/5.13.0.md#bugs)**
+- **[Miscellany](release-notes/5.13.0.md#misc)**
+- **[Credits](release-notes/5.13.0.md#credits)**
+- **[Feedback](release-notes/5.13.0.md#feedback)**
+
+## CiviCRM 5.12.4
+
+Released April 25, 2019
+
+- **[Synopsis](release-notes/5.12.4.md#synopsis)**
+- **[Bugs resolved](release-notes/5.12.4.md#bugs)**
+- **[Credits](release-notes/5.12.4.md#credits)**
+- **[Feedback](release-notes/5.12.4.md#feedback)**
+
+## CiviCRM 5.12.3
+
+Released April 20, 2019
+
+- **[Synopsis](release-notes/5.12.3.md#synopsis)**
+- **[Bugs resolved](release-notes/5.12.3.md#bugs)**
+- **[Credits](release-notes/5.12.3.md#credits)**
+- **[Feedback](release-notes/5.12.3.md#feedback)**
+
+## CiviCRM 5.12.2
+
+Released April 19, 2019
+
+- **[Synopsis](release-notes/5.12.2.md#synopsis)**
+- **[Bugs resolved](release-notes/5.12.2.md#bugs)**
+- **[Credits](release-notes/5.12.2.md#credits)**
+- **[Feedback](release-notes/5.12.2.md#feedback)**
+
+## CiviCRM 5.12.1
+
+Released April 15, 2019
+
+- **[Synopsis](release-notes/5.12.1.md#synopsis)**
+- **[Bugs resolved](release-notes/5.12.1.md#bugs)**
+- **[Credits](release-notes/5.12.1.md#credits)**
+- **[Feedback](release-notes/5.12.1.md#feedback)**
+
## CiviCRM 5.12.0
Released April 3, 2019
--- /dev/null
+# CiviCRM 5.12.2
+
+Released April 19, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Bugs resolved](#bugs)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| Change the database schema? | no |
+| Alter the API? | no |
+| Require attention to configuration options? | no |
+| Fix problems installing or upgrading to a previous version? | no |
+| Introduce features? | no |
+| **Fix bugs?** | **yes** |
+
+## <a name="bugs"></a>Bugs resolved
+
+- **Menu - Fix a visual issue where the menu obscures modal dialogs ([14066](https://github.com/civicrm/civicrm-core/pull/14066))**
+- **CiviMail - Fix an error in "Preview as HTML" ([dev/mail#41](https://lab.civicrm.org/dev/mail/issues/41): [14081](https://github.com/civicrm/civicrm-core/pull/14081))**
+- **Contact Dashboard - Restore missing buttons ("Pay Now", "Print Invoice") ([dev/core#534](https://lab.civicrm.org/dev/core/issues/534): [14051](https://github.com/civicrm/civicrm-core/pull/14051))**
+- **Drupal 8 - Restore coloring ([dev/drupal#56](https://lab.civicrm.org/dev/drupal/issues/56): [8b7b2f58](https://github.com/civicrm/civicrm-core/commit/8b7b2f58fb441a2ea4780ba5dafc32903282e7aa))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following authors and reviewers:
+
+Wikimedia Foundation - Eileen McNaughton; Tadpole Collective - Kevin
+Cristiano; Richard van Oosterhout; Megaphone Technology Consulting - Jon
+Goldberg; Lighthouse Design and Consulting - Brian Shaughnessy; JMA
+Consulting - Monish Deb; CiviFirst - John Kirk; CiviCRM - Tim Otten, Coleman
+Watts; Caltha - Tomasz Pietrzkowski; Australian Greens - Seamus Lee
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Tim Otten and Andrew Hunt. If you'd like to
+provide feedback on them, please login to https://chat.civicrm.org/civicrm and
+contact `@agh1`.
--- /dev/null
+# CiviCRM 5.12.3
+
+Released April 20, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Bugs resolved](#bugs)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| Change the database schema? | no |
+| Alter the API? | no |
+| Require attention to configuration options? | no |
+| Fix problems installing or upgrading to a previous version? | no |
+| Introduce features? | no |
+| **Fix bugs?** | **yes** |
+
+## <a name="bugs"></a>Bugs resolved
+
+- **Fix regression in "Find Pledges" ([dev/core#887](https://lab.civicrm.org/dev/core/issues/887): [14092](https://github.com/civicrm/civicrm-core/pull/14092))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following authors and reviewers:
+
+Wikimedia Foundation - Eileen McNaughton; Tadpole Collective - Kevin
+Cristiano; Korlon - Stuart Gaston; Australian Greens - Seamus Lee
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Tim Otten and Andrew Hunt. If you'd like to
+provide feedback on them, please login to https://chat.civicrm.org/civicrm and
+contact `@agh1`.
--- /dev/null
+# CiviCRM 5.12.4
+
+Released April 25, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Bugs resolved](#bugs)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| Change the database schema? | no |
+| Alter the API? | no |
+| Require attention to configuration options? | no |
+| Fix problems installing or upgrading to a previous version? | no |
+| Introduce features? | no |
+| **Fix bugs?** | **yes** |
+
+## <a name="bugs"></a>Bugs resolved
+
+- **CiviMail - Fix "Preview" action when using `viewUrl` tokens and mailing hashes. ([dev/core#891](https://lab.civicrm.org/dev/core/issues/891): [14124](https://github.com/civicrm/civicrm-core/pull/14124))**
+
+- **Installer - Fix diagnostic for MySQL `utf8mb4` support. ([dev/core#880](https://lab.civicrm.org/dev/core/issues/880): [14129](https://github.com/civicrm/civicrm-core/pull/14129))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following authors and reviewers:
+
+Wikimedia Foundation - Eileen McNaughton; Australian Greens - Seamus Lee;
+Lighthouse Design and Consulting - Brian Shaughnessy; Electronic Frontier Foundation - Mark Burdett
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Tim Otten and Andrew Hunt. If you'd like to
+provide feedback on them, please login to https://chat.civicrm.org/civicrm and
+contact `@agh1`.
--- /dev/null
+# CiviCRM 5.13.0
+
+Released May 1, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Features](#features)**
+- **[Bugs resolved](#bugs)**
+- **[Miscellany](#misc)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| **Change the database schema?** | **yes** |
+| **Alter the API?** | **yes** |
+| **Require attention to configuration options?** | **yes** |
+| **Fix problems installing or upgrading to a previous version?** | **yes** |
+| **Introduce features?** | **yes** |
+| **Fix bugs?** | **yes** |
+
+## <a name="features"></a>Features
+
+### Core CiviCRM
+
+- **Configurable menubar color
+ ([13996](https://github.com/civicrm/civicrm-core/pull/13996))**
+
+ v5.12 introduced a new menu bar. The change also revised the default color
+ scheme (applying a more contemporary palette), but this created stress for
+ some users who were trained to recognize the old menu color. This exposes a
+ new setting for customizing the color scheme, and it changes the default to
+ match previous scheme (be black instead of beige).
+
+- **Menu config screen improvements
+ ([14002](https://github.com/civicrm/civicrm-core/pull/14002))**
+
+ Improves the Menu configuration screen by: making changes to the menu (adding
+ or editing menu items) on the admin screen be reflected immediately, adding
+ links to the related settings pages to reduce confusion about how to configure
+ various aspects of the menu bar and fixing the broken icon picker and missing
+ CiviCRM icon.
+
+- **What to do with the merge screen
+ ([dev/core#824](https://lab.civicrm.org/dev/core/issues/824):
+ [13898](https://github.com/civicrm/civicrm-core/pull/13898) and
+ [13895](https://github.com/civicrm/civicrm-core/pull/13895)) CONTINUES WORK**
+
+ Continues work to clean up the Merge screen by moving toward
+ using contact type icons in a standard way instead of the contact type names
+ and cleaning up alignment.
+
+- **Mutliple activity type filters on activity tab on contact records
+ ([13873](https://github.com/civicrm/civicrm-core/pull/13873))**
+
+ Change include/exclude activity type filters to be multiple select2 widgets so
+ that users can filter my multiple activity types rather than only permitting
+ users to select one activity type with a traditional select field.
+
+- **Added a DB check to prevent deleting exisiting CiviCRM data from database.
+ ([13944](https://github.com/civicrm/civicrm-core/pull/13944))**
+
+ When installing CiviCRM this change adds a check to see if there are existing
+ CiviCRM tables and requires users to manually remove any CiviCRM tables
+ before continuing to prevent users from accidentally deleting tables.
+
+- **Encourage developers to use .then instead of .done
+ ([13982](https://github.com/civicrm/civicrm-core/pull/13982))**
+
+ This change makes it so the Api Explorer generates js code using `.then()`
+ (instead of `.done`) and demonstrates proper errQor handling to encourage
+ developers to use `.then()`.
+
+- **Replace jcalendar instances with datepicker
+ ([dev/core#561](https://lab.civicrm.org/dev/core/issues/561):
+ [13919](https://github.com/civicrm/civicrm-core/pull/13919),
+ [13855](https://github.com/civicrm/civicrm-core/pull/13855),
+ [13965](https://github.com/civicrm/civicrm-core/pull/13965),
+ [13950](https://github.com/civicrm/civicrm-core/pull/13950) and
+ [13918](https://github.com/civicrm/civicrm-core/pull/13918)) CONTINUES WORK**
+
+ Moves from jcalendar to datepicker in the following places: the fulfilled date
+ on the premium tab on back end contribution add/edit screens, the activity
+ tab, the receive_date and the renewal_date fields in Membership forms and the
+ transaction date field on the update pending status task. And updates tests to
+ reflect progress getting rid of jcalendar.
+
+- **Expose sort_name as a dedupe-matchable field
+ ([13864](https://github.com/civicrm/civicrm-core/pull/13864))**
+
+ Allow sort_name to be used in dedupe rules.
+
+- **Standardise setTitle method on forms
+ ([13781](https://github.com/civicrm/civicrm-core/pull/13781))**
+
+ Makes the title of a form available in the buildForm hook.
+
+- **Send action links on any page that extends CRM_Core_Page_Basic thru
+ hook_civicrm_links
+ ([13068](https://github.com/civicrm/civicrm-core/pull/13068))**
+
+ Makes it so extension developers can use hook_civicrm_links to add or remove
+ links from the Relationship Types Administration Page (CiviCRM Navigation
+ Menu->Administer->Customize Data and Screens->Relationship Types) and any
+ other page that extends CRM_Core_Page_Basic.
+
+- **Improve lock handling for mysql 5.7.5+
+ ([CRM-18011](https://issues.civicrm.org/jira/browse/CRM-18011):
+ [13854](https://github.com/civicrm/civicrm-core/pull/13854))**
+
+ Ensures mysql locks are supported on mysql 5.7.5+ and MariaDB '10.0.2'+.
+
+- **Deploy PEAR Log package and upgrade to latest version in the process
+ ([13835](https://github.com/civicrm/civicrm-core/pull/13835))**
+
+ Upgrades the PEAR Log package version and deploys it via
+ composer.
+
+- **Make cacheCode optional in CRM.loadScript
+ ([13824](https://github.com/civicrm/civicrm-core/pull/13824))**
+
+ A cacheCode was recently added to script urls fetched by CRM.getScript(). This
+ is not always desirable e.g. for scripts fetched from an external source, this
+ change makes it so the cacheCode is added by default but can be disabled.
+
+- **Load hooks during upgrade mode
+ ([13551](https://github.com/civicrm/civicrm-core/pull/13551))**
+
+ Allow extensions to load hooks during an upgrade.
+
+- **Checkbox to explicitly change employer when sharing address
+ ([CRM-21008](https://issues.civicrm.org/jira/browse/CRM-21008):
+ [13700](https://github.com/civicrm/civicrm-core/pull/13700))**
+
+ Before this change when an individual was set to share an address with an
+ organization, that organization was set as its current employer. This change
+ adds a checkbox that allows users to explicitly tell civicrm whether the
+ organization is the current employer or not when sharing an address.
+
+- **Report improvements
+ ([CRM-21677](https://issues.civicrm.org/jira/browse/CRM-21677):
+ [13792](https://github.com/civicrm/civicrm-core/pull/13792),
+ [13790](https://github.com/civicrm/civicrm-core/pull/13790) and
+ [13780](https://github.com/civicrm/civicrm-core/pull/13780))**
+
+ These changes improve reports by removing redundant birth date and gender
+ evaluation code.
+
+- **Contact Subtype field at Reports does not support contacts with multiple
+ subtypes ([dev/core/544](https://lab.civicrm.org/dev/core/issues/544):
+ [13158](https://github.com/civicrm/civicrm-core/pull/13158) and
+ [13908](https://github.com/civicrm/civicrm-core/pull/13908))**
+
+ Makes reports support filtering on multiple contact subtypes.
+
+- **Replace all instances of CRM_Core_Fatal with throw new CRM_Core_Exception
+ ([dev/core#560](https://lab.civicrm.org/dev/core/issues/560):
+ [13850](https://github.com/civicrm/civicrm-core/pull/13850)) CONTINUES WORK**
+
+ Updates Cancel Billing & Update Billing screens to use status bounce rather
+ than throw a fatal error.
+
+- **Activity tab performance fix - switch to faster getActivities &
+ getActivitiesCount
+ ([13768](https://github.com/civicrm/civicrm-core/pull/13768))**
+
+ Performance improvement when loading the activity tab for a contact.
+
+- **Add hook findDuplicates
+ ([13234](https://github.com/civicrm/civicrm-core/pull/13234))**
+
+ Adds the hook findDuplicates which provides the ability for extensions to
+ intercept and/or override core duplicate checking when
+ registering/contributing.
+
+- **Deadlocks and performance issues when using smartgroups / ACLs extensively
+ ([dev/core#748](https://lab.civicrm.org/dev/core/issues/748):
+ [13772](https://github.com/civicrm/civicrm-core/pull/13772)) CONTINUES WORK**
+
+ Improves performance by switching the alphabetQuery to use new
+ getSearchSQLParts() function.
+
+- **Improve data when known time-dependent-failing test fails
+ ([13964](https://github.com/civicrm/civicrm-core/pull/13964))**
+
+ Improves output data when time dependent tests fail.
+
+- **Use TempTable methods.
+ ([13880](https://github.com/civicrm/civicrm-core/pull/13880),
+ [13865](https://github.com/civicrm/civicrm-core/pull/13865),
+ [13819](https://github.com/civicrm/civicrm-core/pull/13819),
+ [13848](https://github.com/civicrm/civicrm-core/pull/13848),
+ [13847](https://github.com/civicrm/civicrm-core/pull/13847) and
+ [13703](https://github.com/civicrm/civicrm-core/pull/13703))**
+
+ These changes move towards using the TempTable class to improve
+ naming standards, including but not limited to the following places: when
+ creating the dedupe table, on the contribution detail report, on the
+ bookkeeping report and when debugging.
+
+- **Allow extensions to enable validate.tpl
+ ([13961](https://github.com/civicrm/civicrm-core/pull/13961))**
+
+ This change makes it possible for extensions to add a validate.tpl which
+ provides front end javascript validation, which improves user experience by
+ making it so users do not have to refresh the page to see validation issues.
+
+- **Promise polyfill for older browsers
+ ([13955](https://github.com/civicrm/civicrm-core/pull/13955))**
+
+ Loads a polyfill for IE aQnd other outdated browsers so developers can use
+ native js Promises in our code.
+
+### CiviCase
+
+- **Case Activity Assignment Restriction
+ ([dev/core#641](https://lab.civicrm.org/dev/core/issues/641):
+ [13541](https://github.com/civicrm/civicrm-core/pull/13541))**
+
+ Makes it possible to restrict the assignment of case activities to
+ a group or to contacts having user accounts.
+
+### CiviContribute
+
+- **Add cancel_reason field to civicrm_contribution_recur table
+ ([dev/core#830](https://lab.civicrm.org/dev/core/issues/830):
+ [13930](https://github.com/civicrm/civicrm-core/pull/13930),
+ [13999](https://github.com/civicrm/civicrm-core/pull/13999), and
+ [14164](https://github.com/civicrm/civicrm-core/pull/14164))**
+
+ Adds a recur cancel reason field `civicrm_contribution_recur.cancel_reason
+ field`.
+
+- **Add ID / Test ID for payment processors to list - makes setup of IPNs much
+ easier! ([13869](https://github.com/civicrm/civicrm-core/pull/13869))**
+
+ Adds a column for payment processor id and test payment processor id to the
+ table of "Settings - Payment Processors" page so that users can more easily
+ access these ids.
+
+- **Add payment_processor column/filter to recurring contribution report
+ ([13699](https://github.com/civicrm/civicrm-core/pull/13699))**
+
+ On the "Recurring Contribution" report, this adds "Payment Processor" as an
+ option to the Column and Filter tabs enabling users to filter this report by
+ "Payment Processor" and/or include a column for "Payment Processor".
+
+- **Payment processor names: separate internal and external usage
+ ([dev/financial#2](https://lab.civicrm.org/dev/financial/issues/2):
+ [13995](https://github.com/civicrm/civicrm-core/pull/13995) and
+ [13954](https://github.com/civicrm/civicrm-core/pull/13954))**
+
+ Adds the field `payment_processor.title` to the schema and makes it
+ translatable.
+
+- **Support paying refunds
+ ([dev/financial#38](https://lab.civicrm.org/dev/financial/issues/38):
+ [13952](https://github.com/civicrm/civicrm-core/pull/13952)) BEGINS WORK**
+
+ Adds a PaymentProcessor.refund API which makes it possible for payment
+ processor extension authors to have their extensions issue refund payments.
+
+- **Add minimal PaymentProcessor.pay api
+ ([13953](https://github.com/civicrm/civicrm-core/pull/13953))**
+
+ Adds a new api PaymentProcessor.pay.
+
+- **Include lower level data when throwing an exception on payment processor.pay
+ ([14006](https://github.com/civicrm/civicrm-core/pull/14006))**
+
+ Improves error processing when using the PaymentProcessor.pay api.
+
+- **Add billingblock region to event registration thankyou to match contribution
+ thankyou ([13762](https://github.com/civicrm/civicrm-core/pull/13762))**
+
+ This change makes it so one can use the same method to
+ replace billingblock for both event and contribution thankyou workflows.
+
+- **CQ: Refactor Recurring Contribution Forms
+ ([dev/core#846](https://lab.civicrm.org/dev/core/issues/846):
+ [13940](https://github.com/civicrm/civicrm-core/pull/13940)) BEGINS WORK**
+
+ Begins work to refactor recurring contribution forms specifically by
+ rationalizing url variables into shared parent for recurring contribution
+ forms.
+
+- **Use label not name for payment processor type
+ ([13885](https://github.com/civicrm/civicrm-core/pull/13885))**
+
+ On the "Settings - Payment Processor" page changes the "Processor Type" column
+ to use the label instead of the name.
+
+- **Improve ContributionPage.validate api
+ ([13798](https://github.com/civicrm/civicrm-core/pull/13798))**
+
+ Makes it so that one can use the ContributionPage validate api on POST, for
+ example when using Paypal Checkout which calls a Promise, the
+ ContributionPage.validate api could be called to determine whether to proceed
+ after the button is pushed.
+
+- **Add pseudoconstant support for payment_processor_id on ContributionRecur
+ ([13698](https://github.com/civicrm/civicrm-core/pull/13698))**
+
+- **Allow payment processor to determine the text around 'continue'
+ ([13787](https://github.com/civicrm/civicrm-core/pull/13787))**
+
+
+### CiviEvent
+
+- **Expose Registered by Participant Name field to participant report
+ ([dev/core#835](https://lab.civicrm.org/dev/core/issues/835):
+ [13936](https://github.com/civicrm/civicrm-core/pull/13936))**
+
+ Exposes "Registered by Participant Name" field to participant reports.
+
+### CiviMail
+
+- **Report results don't show inactive campaigns
+ ([dev/core#491](https://lab.civicrm.org/dev/core/issues/491):
+ [13383](https://github.com/civicrm/civicrm-core/pull/13383))**
+
+ Standardizes the way campaign fields are added to the "Mailing Summary"
+ report.
+
+- **Use Mailing.preview API to display mailing in browser
+ ([14163](https://github.com/civicrm/civicrm-core/pull/14163))**
+
+ This resolves an error on sites with Flexmailer when an anonymous visitor
+ views a mailing in the browser.
+
+### CiviMember
+
+- **Membership form address fields for payment processors
+ ([13802](https://github.com/civicrm/civicrm-core/pull/13802))**
+
+ Standardizes processing and validating address parameters on the
+ Membership form.
+
+### Wordpress Integration
+
+- **Cleaner front-end URLs
+ ([144](https://github.com/civicrm/civicrm-wordpress/pull/144))**
+
+ Makes Wordpress URLs have the same structure as Drupal URLs ex:
+ `https://domain.tld/civicrm/contribute/transact/?reset=1&id=1 as opposed to
+ old` Wordpress URLs that looked like
+ `https://domain.tld/civicrm/?page=CiviCRM&q=civicrm/contribute/transact&reset=1&id=1`
+
+## <a name="bugs"></a>Bugs resolved
+
+### Core CiviCRM
+
+- **Add a test matrix for E2E tests on each CMS
+ ([infra/ops#878](https://lab.civicrm.org/infra/ops/issues/878):
+ [13810](https://github.com/civicrm/civicrm-core/pull/13810),
+ [13826](https://github.com/civicrm/civicrm-core/pull/13826) and
+ [13811](https://github.com/civicrm/civicrm-core/pull/13811)) CONTINUES WORK**
+
+ These changes resolve bugs when running E2E tests on WordPress moving the
+ project towards the goal of having a test matrix for E2E tests for each CMS
+ that CiviCRM is compatible with.
+
+- **Use the correct membership date for the notification that appear after
+ completing the membership payment in case pre hook is used
+ ([dev/core#288](https://lab.civicrm.org/dev/core/issues/288):
+ [12583](https://github.com/civicrm/civicrm-core/pull/12583))**
+
+ This change ensures that any changes made to the membership dates using
+ hook_civicrm_pre are taken into account when generating the membership payment
+ notification.
+
+- **Custom Field checkbox value renders empty if the values are randomly sorted
+ ([dev/core#499](https://lab.civicrm.org/dev/core/issues/499):
+ [13051](https://github.com/civicrm/civicrm-core/pull/13051))**
+
+ This change ensures that the values selected by a user for alphanumeric
+ checkbox custom fields render properly in view mode.
+
+- **New Organisation: "Check For Matching Contact (S)" button does not find
+ matching records ([dev/core#570](https://lab.civicrm.org/dev/core/issues/570):
+ [13398](https://github.com/civicrm/civicrm-core/pull/13398))**
+
+ This change ensures that "Check For Matching Contact(s)" retrieves
+ contacts for users with limited permissions.
+
+- **Soft Credits Multiply GIft Amount in Contribution Detail Report
+ ([dev/core#655](https://lab.civicrm.org/dev/core/issues/655):
+ [13906](https://github.com/civicrm/civicrm-core/pull/13906))**
+
+ This change updates the Contribution Detail report so that the "Total Amount"
+ field is not summed because the summing of the "Total Amount" field was
+ leading to the "Total Amount" field for contributions with multiple soft
+ credits to be multiplied by the number of soft credits.
+
+- **Add new indexes when updating log table schema regardless of engine change
+ ([dev/core#664](https://lab.civicrm.org/dev/core/issues/664):
+ [13462](https://github.com/civicrm/civicrm-core/pull/13462))**
+
+ This change makes it so that when the alterLogTables hook defines a new index
+ it is applied regardless of the engine.
+
+- **Contacts -> New Email give Unknown Error in Smarty when Allow Mail to be
+ sent from logged in contact's email address disabled
+ ([dev/core#688](https://lab.civicrm.org/dev/core/issues/688):
+ [13508](https://github.com/civicrm/civicrm-core/pull/13508))**
+
+ This change fixes an error "Warning: Smarty error" when attempting to send an
+ email from Contacts -> New Email for sites with "Allow Mail to be sent from
+ logged in user" disabled.
+
+- **Edit contribution : wrong decimal separator on total_amount for
+ participant(s) ([dev/core#706](https://lab.civicrm.org/dev/core/issues/706):
+ [13554](https://github.com/civicrm/civicrm-core/pull/13554))**
+
+ This change ensures that the decimal separator on total_amount field for
+ participant(s) is displayed as it is configured on the site.
+
+- **Contact Report: The filter by the custom datetime field with "Today" option
+ doesn't find matching contacts
+ ([dev/core#709](https://lab.civicrm.org/dev/core/issues/709):
+ [13567](https://github.com/civicrm/civicrm-core/pull/13567))**
+
+ This change ensures that on the Contact Report, when using a filter for a
+ custom datetime field the "Today" option properly filters results.
+
+- **Address API incorrectly sets state_province_id if multiple countries have
+ same state name / abbreviation
+ ([dev/core#725](https://lab.civicrm.org/dev/core/issues/725):
+ [13938](https://github.com/civicrm/civicrm-core/pull/13938))**
+
+ This change fixes a regression so that the Address API country_id parameter
+ works with an abbreviation or numeric id.
+
+- **Advanced Search: There is an Internal Server Error (500) when the user tries
+ to search by the "Mailing List" group type
+ ([dev/core#726](https://lab.civicrm.org/dev/core/issues/726):
+ [13603](https://github.com/civicrm/civicrm-core/pull/13603) and
+ [13888](https://github.com/civicrm/civicrm-core/pull/13888))**
+
+ Fixes a bug where searching by a group type (ex: Mailing List) on the Advanced
+ Search form would result in a fatal error so that this search runs as
+ expected.
+
+- **Notes: It isn't possible to edit note if the user uploaded an image larger
+ than 3 MByte(s) ([dev/core#740](https://lab.civicrm.org/dev/core/issues/740):
+ [13640](https://github.com/civicrm/civicrm-core/pull/13640))**
+
+ This change makes it so that it is possible to edit a note field
+ that includes images larger than 3 MByte(s).
+
+- **Custom field caching is not group-specific
+ ([dev/core#755](https://lab.civicrm.org/dev/core/issues/755):
+ [13900](https://github.com/civicrm/civicrm-core/pull/13900))**
+
+ Adds the $groupTitle parameter to the cache key for custom fields, so field
+ names that exist in multiple groups will be cached separately.
+
+- **Warning: A non-numeric value encountered in ...
+ ([dev/core#788](https://lab.civicrm.org/dev/core/issues/788):
+ [13795](https://github.com/civicrm/civicrm-core/pull/13795))**
+
+ This change fixes several warnings "Warning: A non-numeric value encountered
+ in ..." on contribution pages & event registrations forms.
+
+- **PHP Warning "explode() expects parameter 2 to be string, array given" for
+ multi-value country fields
+ ([dev/core#795](https://lab.civicrm.org/dev/core/issues/795):
+ [13858](https://github.com/civicrm/civicrm-core/pull/13858))**
+
+ Fixes a PHP warning when updating a multiselect country field.
+
+- **Prefix/suffix select2 renders oddly on public-facing pages
+ ([dev/core#798](https://lab.civicrm.org/dev/core/issues/798):
+ [13816](https://github.com/civicrm/civicrm-core/pull/13816))**
+
+ This change makes the Prefix/suffix select2's render full height (as opposed
+ to squished) in contribution/event profiles.
+
+- **DB Error:: Already exists during renewing membership automatically
+ ([dev/core#806](https://lab.civicrm.org/dev/core/issues/806):
+ [13852](https://github.com/civicrm/civicrm-core/pull/13852))**
+
+ Fixes a DB error "already exists" when recording recurring payments with taxes
+ enabled.
+
+- **Autocomplete select list disabled options
+ ([dev/core#811](https://lab.civicrm.org/dev/core/issues/811):
+ [13859](https://github.com/civicrm/civicrm-core/pull/13859))**
+
+ This change ensures that for select fields with autocomplete, only enabled
+ options autocomplete.
+
+- **Search results: Actions: Export contacts: DB Error: Syntax error occurs when
+ not all necessary fields are selected
+ ([dev/core#819](https://lab.civicrm.org/dev/core/issues/819):
+ [13889](https://github.com/civicrm/civicrm-core/pull/13889))**
+
+ Resolves a fatal database error when attempting to export contacts without
+ selecting any fields to be exported.
+
+- **Value in the "Contact Type" field disappears when the user tries to edit
+ Contact Details ([dev/core#823](https://lab.civicrm.org/dev/core/issues/823):
+ [13945](https://github.com/civicrm/civicrm-core/pull/13945))**
+
+ Ensures that when a user uses a profile with a contact sub type field to
+ update a contact that the contact sub type field pre-populates as expected.
+
+- **Notice error while creating smart group using Contribution Aggregate custom
+ search ([dev/core#837](https://lab.civicrm.org/dev/core/issues/837):
+ [13921](https://github.com/civicrm/civicrm-core/pull/13921))**
+
+ Resolves "Notice: Undefined index:" errors when creating a smart group using
+ Contribution Aggregate custom search.
+
+- **Notice error when deleting profile
+ ([dev/core#840](https://lab.civicrm.org/dev/core/issues/840):
+ [13926](https://github.com/civicrm/civicrm-core/pull/13926))**
+
+ Resolves a "Undefined property" notice when deleting a profile.
+
+- **CQ: Use Guzzle as our preferred way to retrieve via http
+ ([dev/core#849](https://lab.civicrm.org/dev/core/issues/849):
+ [13946](https://github.com/civicrm/civicrm-core/pull/13946))**
+
+ Replaces get_headers functions call with Guzzle HTTP request to prevent timing
+ out.
+
+- **Queries combining multiple text labels using REGEXP do not escape regular
+ expression metacharacters
+ ([dev/core#433](https://lab.civicrm.org/dev/core/issues/433):
+ [12998](https://github.com/civicrm/civicrm-core/pull/12998))**
+
+ Ensures that querying for fee levels that contain regex metacharacters will
+ match.
+
+- **Fix status type (error, not fail) for CRM_Core_Session::setStatus
+ ([13943](https://github.com/civicrm/civicrm-core/pull/13943))**
+
+ Fixes an incorrect status for setMessage which was using 'fail' (which is not
+ a valid status) instead of 'error'.
+
+- **Covert the CRM_Core_Error::fatal calls to exceptions when trying to access
+ Contact Photos ([13917](https://github.com/civicrm/civicrm-core/pull/13917))**
+
+ Cleaner errors when attempting to access contact photos fails.
+
+- **CiviCRM API, lookup state_province_id options based on country parameter if
+ present, or default country
+ ([13596](https://github.com/civicrm/civicrm-core/pull/13596))**
+
+ Ensures the CiviCRM Address API correctly sets state_province_id for states
+ whose name/abbreviation exist in multiple countries.
+
+- **Fix php 7.2 count notice
+ ([13877](https://github.com/civicrm/civicrm-core/pull/13877))**
+
+ Fixes a "Warning: count()" error on the "Import Contacts" Summary step screen.
+
+- **New Organisation: "Contact Type" dropdown disappears when fields validation
+ occurs ([dev/core#699](https://lab.civicrm.org/dev/core/issues/699):
+ [13545](https://github.com/civicrm/civicrm-core/pull/13545))**
+
+ Fixes a bug where when creating a new organization, if the form fails
+ validation the "Contact Sub Type" dropdown disappears.
+
+- **Fix contact.merge api to pass check_permissions parameter through to the
+ deeper layer ([13807](https://github.com/civicrm/civicrm-core/pull/13807))**
+
+ Fixes a bug where calling Contact.merge from php will leave the merged contact
+ unmerged if the logged in user does not have the delete contacts permission
+
+- **checkEditInboundEmailsPermissions should be a static function
+ ([13805](https://github.com/civicrm/civicrm-core/pull/13805))**
+
+- **DB error "no such field" when executing actions on a sorted contact search
+ result with search profile
+ ([dev/core#502](https://lab.civicrm.org/dev/core/issues/502):
+ [13884](https://github.com/civicrm/civicrm-core/pull/13884))**
+
+- **Transfer picks up the deleted contact ID basically transferring to the wrong
+ contact ([dev/core#314](https://lab.civicrm.org/dev/core/issues/314):
+ [12639](https://github.com/civicrm/civicrm-core/pull/12639))**
+
+- **Fix bug whereby sorting by state province gives an error in search builder
+ ([13748](https://github.com/civicrm/civicrm-core/pull/13748))**
+
+- **Fix Contact.create calls to respect passed in variables & variables set via
+ hook for sort_name & display_name
+ ([13863](https://github.com/civicrm/civicrm-core/pull/13863))**
+
+- **Do not cause a fatal error if no contact_id field for a note is filled in
+ when viewing contact notes
+ ([13910](https://github.com/civicrm/civicrm-core/pull/13910))**
+
+- **Disable phpcs checking in the Crypt files where mcrypt functions are
+ ([14031](https://github.com/civicrm/civicrm-core/pull/14031))**
+
+- **Fix 4.7.31 Upgrade in multilingual mode
+ ([14003](https://github.com/civicrm/civicrm-core/pull/14003))**
+
+- **Optimise the loading of the CiviCRM Deduplication Exception page
+ ([13435](https://github.com/civicrm/civicrm-core/pull/13435))**
+
+- **Unfork Zetacomponents mail and use patch to apply differences
+ ([13934](https://github.com/civicrm/civicrm-core/pull/13934))**
+
+- **Update lockfile to take into account of civicrm/zetacomponents-mail#4 being
+ merged ([13822](https://github.com/civicrm/civicrm-core/pull/13822))**
+
+- **Upgrade zetacomponents/base and zetacomponents/mail
+ ([13799](https://github.com/civicrm/civicrm-core/pull/13799))**
+
+- **Smart group with uf_group_id does not load contacts with same search profile
+ ([dev/core#771](https://lab.civicrm.org/dev/core/issues/771):
+ [13742](https://github.com/civicrm/civicrm-core/pull/13742))**
+
+- **Fix Deprecation notice for use of `while` in PHP7.2 in bin/cli.class.php
+ ([dev/core#907](https://lab.civicrm.org/dev/core/issues/907):
+ [14155](https://github.com/civicrm/civicrm-core/pull/14155))**
+
+### CiviCase
+
+- **PR 13333 breaks the Save and New button on a new case
+ ([dev/core#904](https://lab.civicrm.org/dev/core/issues/904):
+ [14145](https://github.com/civicrm/civicrm-core/pull/14145))**
+
+ This reverts a change making the Save and New button `submitOnce`, as that
+ prevented the button from opening a new case form after saving.
+
+- **Creating a new relationship type while editing case type definition adds a
+ blank row in the roles section
+ ([dev/core#784](https://lab.civicrm.org/dev/core/issues/784):
+ [13785](https://github.com/civicrm/civicrm-core/pull/13785))**
+
+- **PHP warnings on Case Dashboard and Find Cases
+ ([13998](https://github.com/civicrm/civicrm-core/pull/13998))**
+
+### CiviContribute
+
+- **Can't self-service cancel a recurring contribution made while you're logged
+ in ([dev/core#571](https://lab.civicrm.org/dev/core/issues/571):
+ [13237](https://github.com/civicrm/civicrm-core/pull/13237))**
+
+ This change makes it so that users without "edit contributions" permission can
+ edit their own recurring contribution subscriptions if they are logged in,
+ before this change they could only edit their own contribution subscriptions
+ thru a checksum link.
+
+- **Possible paypal fix to avoid sending 500 errors from ipn triggerred by
+ one-off payment
+ ([13867](https://github.com/civicrm/civicrm-core/pull/13867))**
+
+ Fixes paypal system sending a warning email when there is a failed IPN call
+ (500 errors from ipn triggered by non-recurring payment).
+
+- **Missing links to cancel recurring payments (regression .. sorta)
+ ([dev/core#704](https://lab.civicrm.org/dev/core/issues/704):
+ [13935](https://github.com/civicrm/civicrm-core/pull/13935))**
+
+ Fixes a 5.8 regression where the cancel link became unavailable on recurring
+ contributions with no attached payment processor id.
+
+- **Improve flushing after creating a processor so it can be used for a
+ recurring in the same run
+ ([14009](https://github.com/civicrm/civicrm-core/pull/14009))**
+
+ This change ensures tests run properly by flushing caches when creating a
+ payment processor.
+
+- **Flush ContributionRecur static cache when flushing processors
+ ([13962](https://github.com/civicrm/civicrm-core/pull/13962))**
+
+ Ensures a (new) static cache is flushed when creating a processor, mostly
+ useful for unit testing.
+
+- **Display test contributions when viewing contributions related to a test
+ recurring contribution
+ ([13779](https://github.com/civicrm/civicrm-core/pull/13779))**
+
+### CiviEvent
+
+- **Cancelling or An Error during event registration payment should cancel all
+ additional participates
+ ([dev/core#253](https://lab.civicrm.org/dev/core/issues/253):
+ [12457](https://github.com/civicrm/civicrm-core/pull/12457))**
+
+ This fixes a bug where if a user was registering for an event with additional
+ participants, and for some reason the payment failed or the user decided to
+ cancel the payment, only the main user participant record was set to
+ "canceled", the rest of the additional participants would have the status
+ "pending incomplete transaction" so that all participant statuses are changed
+ to "canceled".
+
+- **Event Cart: Fix PHP 7.2 fatal error (pass by ref)
+ ([13927](https://github.com/civicrm/civicrm-core/pull/13927))**
+
+ Fixes a Fatal error when using Event cart and PHP 7.2, specifically when
+ checking out.
+
+- **CRM/Event - Fix participant note search parameter being ignored
+ ([13697](https://github.com/civicrm/civicrm-core/pull/13697))**
+
+ This change ensures that when searching by "Participant Note" on the "Search
+ Builder form the filter is applied.
+
+- **BAO_Participant - Use default status if not specified for create
+ ([13875](https://github.com/civicrm/civicrm-core/pull/13875))**
+
+ This change fixes a api4 test failure by ensuring that the default value of
+ 'status_id' is respected by the Participant BAO. Before this change the
+ 'status_id' had a default value and thus was not required but the BAO would
+ not work correctly if a 'status_id' was not supplied. After this change the
+ 'status_id' default is respected and the BAO works regardless of whether the
+ 'status_id' is supplied.
+
+### CiviGrant
+
+- **PHP Error on Grant Detail Report
+ ([13883](https://github.com/civicrm/civicrm-core/pull/13883))**
+
+ Fixes a PHP error when viewing the "Grant Detail Report" for sites running PHP
+ 7.2.
+
+### CiviMail
+
+- **Do not track CSS URLs
+ ([dev/core#836](https://lab.civicrm.org/dev/core/issues/836):
+ [13920](https://github.com/civicrm/civicrm-core/pull/13920))**
+
+ Ensures CiviMail does not convert css URLs into trackable URLs.
+
+- **Restore support for preview of "mailing"/"action" tokens via
+ TokenProcessor/Flexmailer
+ ([14156](https://github.com/civicrm/civicrm-core/pull/14156))**
+
+### CiviMember
+
+- **Disabling or deleting Expired status breaks membership status update
+ ([13259](https://github.com/civicrm/civicrm-core/pull/13259))**
+
+ This change ensures that deleting, disabling or renaming the "Expired"
+ membership status does not cause issues when running the "Membership status
+ processor" scheduled job. Before this change deleting, disabling or renaming
+ the "Expired" membership status would result in the "Membership status
+ processor" scheduled job failing with the message `Finished execution of
+ Membership status processor with result: Failure, Error message: A fatal error
+ was triggered: One of parameters (value: ) is not of the type Integer`.
+
+- **Fatal error to exception on Membership BAO
+ ([13774](https://github.com/civicrm/civicrm-core/pull/13774))**
+
+ This change improves experience by throwing an exception instead of a fatal
+ error.
+
+### Backdrop Integration
+
+- **civicrm/admin/setting/uf - Fix advice about Backdrop Views
+ ($database_prefix)
+ ([13803](https://github.com/civicrm/civicrm-core/pull/13803))**
+
+ This change updates the advice for configuring views on the
+ `civicrm/admin/setting/uf` form so that it works for Backdrop sites.
+
+### Drupal Integration
+
+- **Drupal8: Can't upload images via CKEditor/kcfinder
+ ([dev/drupal#42](https://lab.civicrm.org/dev/drupal/issues/42):
+ [242](https://github.com/civicrm/civicrm-packages/pull/242))**
+
+ Makes it so on Drupal 8 sites users can upload and browse images in KCFinder.
+
+## <a name="misc"></a>Miscellany
+
+- **Fix e-notice in IDS
+ ([247](https://github.com/civicrm/civicrm-packages/pull/247))**
+
+- **Update 7.x Drupal code to be that of the new coder style
+ ([571](https://github.com/civicrm/civicrm-drupal/pull/571))**
+
+- **Fix up to newer coder style
+ ([69](https://github.com/civicrm/civicrm-backdrop/pull/69))**
+
+- **Remove now-obsolete additionalFromClause parameter from prepareOrderBy
+ ([13874](https://github.com/civicrm/civicrm-core/pull/13874))**
+
+- **Remove switch statement that no longer switches
+ ([13886](https://github.com/civicrm/civicrm-core/pull/13886))**
+
+- **Add unit test for exporting with incomplete data
+ ([13904](https://github.com/civicrm/civicrm-core/pull/13904))**
+
+- **Delete webtests
+ ([13861](https://github.com/civicrm/civicrm-core/pull/13861))**
+
+- **Add a class to handle test entities consistently
+ ([13814](https://github.com/civicrm/civicrm-core/pull/13814))**
+
+- **Fix up composer for composer 2.0 compatibility
+ ([13872](https://github.com/civicrm/civicrm-core/pull/13872))**
+
+- **Remove log files as now supplied by composer
+ ([244](https://github.com/civicrm/civicrm-packages/pull/244), [245](https://github.com/civicrm/civicrm-packages/pull/245))**
+
+- **Remove htmlpurifier from within the IDS to facilitate it being provided by
+ composer ([246](https://github.com/civicrm/civicrm-packages/pull/246))**
+
+- **Remove Log.php require_once statements
+ ([13842](https://github.com/civicrm/civicrm-core/pull/13842))**
+
+- **Remove amavisd now that it is removed from the packages repository
+ ([243](https://github.com/civicrm/civicrm-packages/pull/243), [13841](https://github.com/civicrm/civicrm-core/pull/13841))**
+
+- **Upgrade htmlpurifier to 4.10 to support PHP7.2 and install via composer
+ ([13840](https://github.com/civicrm/civicrm-core/pull/13840))**
+
+- **Refactor CRM_Contact_Form_Task_PDFLetterCommon
+ ([13892](https://github.com/civicrm/civicrm-core/pull/13892))**
+
+- **Reformat test files for array format
+ ([13862](https://github.com/civicrm/civicrm-core/pull/13862))**
+
+- **Logging - attempt to fix tests
+ ([13832](https://github.com/civicrm/civicrm-core/pull/13832))**
+
+- **Try Reverting commit removing require once to see if it fixes the problem
+ for api4 ([13870](https://github.com/civicrm/civicrm-core/pull/13870))**
+
+- **Import date test
+ ([13823](https://github.com/civicrm/civicrm-core/pull/13823))**
+
+- **Add shared parent for ContributionRecur forms
+ ([13931](https://github.com/civicrm/civicrm-core/pull/13931))**
+
+- **Update PHPWord Patches to match the latest versions of their code
+ ([13923](https://github.com/civicrm/civicrm-core/pull/13923))**
+
+- **Extract assignPaymentFields
+ ([13957](https://github.com/civicrm/civicrm-core/pull/13957))**
+
+- **Move code to assign tax information into shared parent
+ ([13899](https://github.com/civicrm/civicrm-core/pull/13899))**
+
+- **Update test to reflect recently merged PR lower permission to access
+ dedupecheck ([13866](https://github.com/civicrm/civicrm-core/pull/13866))**
+
+- **Test fix ([13856](https://github.com/civicrm/civicrm-core/pull/13856))**
+
+- **Add unit testing for activity creation when cancelling a recurring, related
+ cleanup ([14000](https://github.com/civicrm/civicrm-core/pull/14000))**
+
+- **Improve test coverage for CRM_Utils_Color::getRgb()
+ ([14007](https://github.com/civicrm/civicrm-core/pull/14007))**
+
+- **Add in tests of purifying HTML output
+ ([13845](https://github.com/civicrm/civicrm-core/pull/13845))**
+
+- **Remove more instances of ->free()
+ ([dev/core#562](https://lab.civicrm.org/dev/core/issues/562):
+ [13786](https://github.com/civicrm/civicrm-core/pull/13786)) CONTINUES WORK**
+
+- **(NFC) Ensure phpcs ignores eval notice in these files as it is required
+ ([14032](https://github.com/civicrm/civicrm-core/pull/14032))**
+
+- **(NFC) Lint additional php files up to the new coder standard
+ ([14025](https://github.com/civicrm/civicrm-core/pull/14025))**
+
+- **Port code style fixes to 5.13 from master
+ ([14026](https://github.com/civicrm/civicrm-core/pull/14026))**
+
+- **(NFC) Update CRM/Core CRM/Custom CRM/Dedupe to match the new coder style
+ ([14023](https://github.com/civicrm/civicrm-core/pull/14023))**
+
+- **(NFC) Update CRM/Event folder for the new coder style
+ ([14019](https://github.com/civicrm/civicrm-core/pull/14019))**
+
+- **(NFC) update CRM/Contribute to be the new coder standard
+ ([14021](https://github.com/civicrm/civicrm-core/pull/14021))**
+
+- **(NFC) Update CRM/Friend CRM/Grant CRM/Group CRM/Mailing to be up to d…
+ ([14016](https://github.com/civicrm/civicrm-core/pull/14016))**
+
+- **(NFC) Update CRM/Badge CRM/Campaign CRM/Case to be up to date with a …
+ ([14017](https://github.com/civicrm/civicrm-core/pull/14017))**
+
+- **(NFC) Update CRM/Cxn CRM/Dashlet CRM/Export CRM/Extension and CRM/Fin…
+ ([14018](https://github.com/civicrm/civicrm-core/pull/14018))**
+
+- **[NFC] Short array syntax - auto convert settings dir
+ ([14005](https://github.com/civicrm/civicrm-core/pull/14005))**
+
+- **(NFC) SchemaStructure.php - Fix up mismatch between stored+generated code
+ ([14046](https://github.com/civicrm/civicrm-core/pull/14046))**
+
+- **Arg I put these fixes in 5.12 & master while trying for 5.13
+ ([14036](https://github.com/civicrm/civicrm-core/pull/14036))**
+
+- **(NFC) Update CRM/Member CRM/Note CRM/Logging CRM/Import and CRM/Price…
+ ([13992](https://github.com/civicrm/civicrm-core/pull/13992))**
+
+- **(REF) CRM_Core_Resources - Move hook declaration from addCoreResources() to
+ Container.php ([14008](https://github.com/civicrm/civicrm-core/pull/14008))**
+
+- **(NFC) Update CRM/Activity CRM/Admin and CRM/Batch folders to be the f…
+ ([13990](https://github.com/civicrm/civicrm-core/pull/13990))**
+
+- **(NFC) Update coding style in PCP, Pledge, Profile, Queue, Report folders
+ ([13987](https://github.com/civicrm/civicrm-core/pull/13987))**
+
+- **(NFC) Update CRM/SMS/ CRM/UF/ CRM/Upgrade/ CRM/Tag/ to be up to speed…
+ ([13986](https://github.com/civicrm/civicrm-core/pull/13986))**
+
+- **(NFC) Bring CRM/Utils folder up to future coder standards
+ ([13985](https://github.com/civicrm/civicrm-core/pull/13985))**
+
+- **(NFC) Set _log and _tableName variables to be public
+ ([13988](https://github.com/civicrm/civicrm-core/pull/13988))**
+
+- **Grammar fixes
+ ([13960](https://github.com/civicrm/civicrm-core/pull/13960))**
+
+- **Update Unit test styling to cover the future coder version
+ ([13983](https://github.com/civicrm/civicrm-core/pull/13983))**
+
+- **(NFC) Fix location of comment to match future coder version
+ ([13984](https://github.com/civicrm/civicrm-core/pull/13984))**
+
+- **(NFC) Bring up API folder to style of future coder checker
+ ([13980](https://github.com/civicrm/civicrm-core/pull/13980))**
+
+- **(NFC) Upgrade Civi Folder to the new coder version
+ ([13981](https://github.com/civicrm/civicrm-core/pull/13981))**
+
+- **(NFC) Update various files to pass future civicrm/coder ruleset
+ ([13979](https://github.com/civicrm/civicrm-core/pull/13979))**
+
+- **(NFC) Update various files to pass current phpcs
+ ([13978](https://github.com/civicrm/civicrm-core/pull/13978))**
+
+- **[NFC] Reformat tricksy file CRM_Mailing_BAO_Mailing
+ ([13973](https://github.com/civicrm/civicrm-core/pull/13973))**
+
+- **[NFC] Reformat tricksy file CRM/Contribute/Import/Form/MapField
+ ([13974](https://github.com/civicrm/civicrm-core/pull/13974))**
+
+- **[NFC] short array syntax Autoformat - just the tricksy bits of CRM/Activity
+ ([13969](https://github.com/civicrm/civicrm-core/pull/13969))**
+
+- **[NFC] array format tricksie file CRM/Admin/Form/MessageTemplates
+ ([13970](https://github.com/civicrm/civicrm-core/pull/13970))**
+
+- **[NFC] array format tricksie file CRM_Utils_Rest
+ ([13971](https://github.com/civicrm/civicrm-core/pull/13971))**
+
+- **[NFC] array formatting tricksy tricksie file (another CRM/UF/Form/Group.php)
+ ([13972](https://github.com/civicrm/civicrm-core/pull/13972))**
+
+- **[NFC] short array syntax Autoformat - just CRM/ACL dir
+ ([13968](https://github.com/civicrm/civicrm-core/pull/13968))**
+
+- **[NFC] Short array syntax - auto-format CRM directory
+ ([13915](https://github.com/civicrm/civicrm-core/pull/13915))**
+
+- **[REF] extract token functions
+ ([13967](https://github.com/civicrm/civicrm-core/pull/13967))**
+
+- **Test fix ([13949](https://github.com/civicrm/civicrm-core/pull/13949))**
+
+- **Payment test cleanup
+ ([13924](https://github.com/civicrm/civicrm-core/pull/13924))**
+
+- **(NFC) Fix mode on files
+ ([13933](https://github.com/civicrm/civicrm-core/pull/13933))**
+
+- **[NFC] Cleanup DAO factory classes for code standards
+ ([13922](https://github.com/civicrm/civicrm-core/pull/13922))**
+
+- **NFC - Short array syntax - auto-convert ang dir
+ ([13912](https://github.com/civicrm/civicrm-core/pull/13912))**
+
+- **NFC - Short array syntax - auto-convert Civi dir
+ ([13911](https://github.com/civicrm/civicrm-core/pull/13911))**
+
+- **[NFC] Short array syntax - auto-convert api dir
+ ([13909](https://github.com/civicrm/civicrm-core/pull/13909))**
+
+- **Minor code cleanup
+ ([13839](https://github.com/civicrm/civicrm-core/pull/13839))**
+
+- **Minor code cleanup - remove unnecessary ids declaration
+ ([13838](https://github.com/civicrm/civicrm-core/pull/13838))**
+
+- **Code cleanup on membership block loop
+ ([13851](https://github.com/civicrm/civicrm-core/pull/13851))**
+
+- **[NFC] IDE formatting only
+ ([13896](https://github.com/civicrm/civicrm-core/pull/13896))**
+
+- **Minor code cleanups around invoicing assignment
+ ([13857](https://github.com/civicrm/civicrm-core/pull/13857))**
+
+- **[nfc] Reset entire session object between tests
+ ([13878](https://github.com/civicrm/civicrm-core/pull/13878))**
+
+- **Fixing formatting of contributors section
+ ([13860](https://github.com/civicrm/civicrm-core/pull/13860))**
+
+- **[NFC] code formatting only
+ ([13846](https://github.com/civicrm/civicrm-core/pull/13846))**
+
+- **[NFC] Code reformatting
+ ([13849](https://github.com/civicrm/civicrm-core/pull/13849))**
+
+- **Add comments about usage for doPayment() function
+ ([13812](https://github.com/civicrm/civicrm-core/pull/13812))**
+
+- **[nfc] Attempt to improve false negatives on Logging test
+ ([13829](https://github.com/civicrm/civicrm-core/pull/13829))**
+
+- **[NFC] remove unnecessary variable
+ ([13836](https://github.com/civicrm/civicrm-core/pull/13836))**
+
+- **REF Extract case action links into a separate function to facilitate
+ refactoring ([13793](https://github.com/civicrm/civicrm-core/pull/13793))**
+
+- **NFC Whitespace cleanup MembershipBlock.tpl
+ ([13830](https://github.com/civicrm/civicrm-core/pull/13830))**
+
+- **Further cleanup on getRelatedMemberships - just get them with the api
+ ([13797](https://github.com/civicrm/civicrm-core/pull/13797))**
+
+- **[REF] small cleanups on payment.create flow.
+ ([13778](https://github.com/civicrm/civicrm-core/pull/13778))**
+
+- **[NFC] reformat Contact api file to switch to new array formatting
+ ([13806](https://github.com/civicrm/civicrm-core/pull/13806))**
+
+- **[REF] minor code simplification - remove over-handling of amount comp with
+ zero ([13783](https://github.com/civicrm/civicrm-core/pull/13783))**
+
+- **Attempted test fix
+ ([13791](https://github.com/civicrm/civicrm-core/pull/13791))**
+
+- **Remove reference to google checkout
+ ([13784](https://github.com/civicrm/civicrm-core/pull/13784))**
+
+- **[NFC] template whitespace cleanup
+ ([13782](https://github.com/civicrm/civicrm-core/pull/13782))**
+
+- **(NFC) Update for compliance with next phpcs standard
+ ([577](https://github.com/civicrm/civicrm-drupal/pull/577))**
+
+- **Lint .inc files in Drupal module folder to match newer coder standard
+ ([574](https://github.com/civicrm/civicrm-drupal/pull/574))**
+
+- **(NFC) Get phpcs to ignore the use of eval in this file as it is required
+ ([575](https://github.com/civicrm/civicrm-drupal/pull/575))**
+
+- **(NFC) Update for compliance with next phpcs standard
+ ([72](https://github.com/civicrm/civicrm-backdrop/pull/72))**
+
+- **(NFC) Lint .inc files and ensure that the eval usage in tests/phpunit…
+ ([71](https://github.com/civicrm/civicrm-backdrop/pull/71))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following code authors:
+
+AGH Strategies - Alice Frumin, Andrew Hunt, Eli Lisseck; Agileware - Alok Patel,
+Francis Whittle; Australian Greens - Seamus Lee; calibrate - Wouter Hechtermans;
+Christian Wach; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Yashodha Chaku;
+CompuCorp - Omar Abu Hussein; Coop SymbioTIC - Mathieu Lutfy; Dave D; Electronic
+Frontier Foundation - Mark Burdett; Freeform Solutions - Herb van den Dool;
+Fuzion - Jitendra Purohit; GreenPeace Central and Eastern Europe - Patrick
+Figel; JMA Consulting - Monish Deb; Megaphone Technology Consulting - Jon
+Goldberg; MJW Consulting - Matthew Wire; Pradeep Nayak; Skvare - Mark Hanna;
+Squiffle Consulting - Aidan Saunders; Stephen Palmstrom; Timbsoft Technologies -
+Tunbola Ogunwande; Wikimedia Foundation - Eileen McNaughton
+
+Most authors also reviewed code for this release; in addition, the following
+reviewers contributed their comments:
+
+Agileware - Justin Freeman; Aniessh Sethh; Artful Robot - Rich Lott; British
+Humanist Association - Andrew West; Circle Interactive - Dave Jenkins; Shitij
+Gugnani; Coop SymbioTIC - Samuel Vanhove; GValFr35; JMA Consulting - Joe Murray;
+Joinery - Allen Shaw; Aivars; Korlon - Stuart Gaston; Lighthouse Design and
+Consulting - Brian Shaughnessy; mcuradoc; Onyemenam Ndubuisi; Tadpole
+Collective - Kevin Cristiano
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Alice Frumin and Andrew Hunt. If you'd like
+to provide feedback on them, please log in to https://chat.civicrm.org/civicrm
+and contact `@agh1`.
--- /dev/null
+# CiviCRM 5.13.1
+
+Released May 2, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Bugs resolved](#bugs)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| Change the database schema? | no |
+| Alter the API? | no |
+| Require attention to configuration options? | no |
+| Fix problems installing or upgrading to a previous version? | no |
+| Introduce features? | no |
+| **Fix bugs?** | **yes** |
+
+## <a name="bugs"></a>Bugs resolved
+
+- **Fix upgrade failure on multilingual sites ([dev/core#931](https://lab.civicrm.org/dev/core/issues/931): [14187](https://github.com/civicrm/civicrm-core/pull/14187))**
+
+- **Fix regression in REST endpoint on WordPress ([dev/wordpress#26](https://lab.civicrm.org/dev/wordpress/issues/26): [14186](https://github.com/civicrm/civicrm-core/pull/14186))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following authors and reviewers:
+
+Australian Greens - Seamus Lee; Megaphone Technology Consulting - Jon Goldberg;
+Tadpole Collective - Kevin Cristiano;
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Tim Otten and Andrew Hunt. If you'd like to
+provide feedback on them, please login to https://chat.civicrm.org/civicrm and
+contact `@agh1`.
--- /dev/null
+# CiviCRM 5.13.2
+
+Released May 6, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Bugs resolved](#bugs)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| Change the database schema? | no |
+| Alter the API? | no |
+| Require attention to configuration options? | no |
+| Fix problems installing or upgrading to a previous version? | no |
+| Introduce features? | no |
+| **Fix bugs?** | **yes** |
+
+## <a name="bugs"></a>Bugs resolved
+
+- **Fix regression in sorting "Activities" tab by "source_name" ([dev/core#934](https://lab.civicrm.org/dev/core/issues/934):
+ [14194](https://github.com/civicrm/civicrm-core/pull/14194), [14204](https://github.com/civicrm/civicrm-core/pull/14204))**
+
+- **Fix regression in which inbound email attachments were saved as `.unknown`" ([dev/core#940](https://lab.civicrm.org/dev/core/issues/940):
+ [14207](https://github.com/civicrm/civicrm-core/pull/14207)**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following authors and reviewers:
+
+Wikimedia Foundation - Eileen McNaughton; CiviCRM - Tim Otten; Australian Greens - Seamus Lee;
+Dave D;
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Tim Otten and Andrew Hunt. If you'd like to
+provide feedback on them, please login to https://chat.civicrm.org/civicrm and
+contact `@agh1`.
--- /dev/null
+# CiviCRM 5.13.3
+
+Released May 14, 2019
+
+- **[Synopsis](#synopsis)**
+- **[Bugs resolved](#bugs)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?* | |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities? | no |
+| Change the database schema? | no |
+| Alter the API? | no |
+| Require attention to configuration options? | no |
+| Fix problems installing or upgrading to a previous version? | no |
+| Introduce features? | no |
+| **Fix bugs?** | **yes** |
+
+## <a name="bugs"></a>Bugs resolved
+
+- **Activity Tab - Fix regression in outputting names with > 25 activities recorded" ([dev/core#942](https://lab.civicrm.org/dev/core/issues/942):
+ [14231](https://github.com/civicrm/civicrm-core/pull/14231))**
+
+- **Activity Search - Fix regression in displaying the "Activity Date" filter
+ ([14230](https://github.com/civicrm/civicrm-core/pull/14230))**
+
+- **Profile - Fix e-notice when creating or editing a profile ([dev/core#923](https://lab.civicrm.org/dev/core/issues/923):
+ [14229](https://github.com/civicrm/civicrm-core/pull/14229))**
+
+- **Menu - Fix Javascript error involving ":hover" selector ([dev/core#950](https://lab.civicrm.org/dev/core/issues/950):
+ [14228](https://github.com/civicrm/civicrm-core/pull/14228))**
+
+- **Event Search - Fix error when filtering participants by 1 event and multiple statuses ([dev/core#956](https://lab.civicrm.org/dev/core/issues/956):
+ [14234](https://github.com/civicrm/civicrm-core/pull/14234))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following authors and reviewers:
+
+Wikimedia Foundation - Eileen McNaughton; Pradeep Nayak; Greenpeace CEE - Patrick Figel;
+Dave D; CiviCRM - Coleman Watts; Australian Greens - Seamus Lee
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Tim Otten and Andrew Hunt. If you'd like to
+provide feedback on them, please login to https://chat.civicrm.org/civicrm and
+contact `@agh1`.
--- /dev/null
+# CiviCRM 5.13.4
+
+Released May 15, 2019
+
+- **[Security advisories](#security)**
+- **[Features](#features)**
+- **[Bugs resolved](#bugs)**
+- **[Miscellany](#misc)**
+- **[Credits](#credits)**
+
+## <a name="security"></a>Security advisories
+
+- **[CIVI-SA-2019-09](https://civicrm.org/advisory/civi-sa-2019-09-xxe-in-phpword)**: XXE in PHPWord
+- **[CIVI-SA-2019-10](https://civicrm.org/advisory/civi-sa-2019-10-tcpdf-xss-and-rce-vulerabilities)**: TCPDF XSS and RCE vulnerabilities
+- **[CIVI-SA-2019-11](https://civicrm.org/advisory/civi-sa-2019-11-jquery-objectprototype-pollution)**: jQuery Object.prototype pollution
+- **[CIVI-SA-2019-12](https://civicrm.org/advisory/civi-sa-2019-12-sqli-in-country-et-al)**: SQLI in "Country", et al
+- **[CIVI-SA-2019-13](https://civicrm.org/advisory/civi-sa-2019-13-harden-against-unserialize-vulnerabilities)**: Harden against unserialize vulnerabilities
+- **[CIVI-SA-2019-14](https://civicrm.org/advisory/civi-sa-2019-14-sqli-in-apiv3-getoptions)**: SQLI in APIv3 GetOptions
+- **[CIVI-SA-2019-15](https://civicrm.org/advisory/civi-sa-2019-15-xss-via-forged-mime-type)**: XSS via forged MIME type
+- **[CIVI-SA-2019-16](https://civicrm.org/advisory/civi-sa-2019-16-sqli-in-certain-checkboxes)**: SQLI in certain checkboxes
+- **[CIVI-SA-2019-17](https://civicrm.org/advisory/civi-sa-2019-17-sqli-in-manage-events)**: SQLI in "Manage Events"
+- **[CIVI-SA-2019-18](https://civicrm.org/advisory/civi-sa-2019-18-xss-in-civicrm-installer)**: XSS in CiviCRM installer
+- **[CIVIEXT-SA-2019-01](https://civicrm.org/advisory/civiext-sa-2019-01-multiple-security-issues-in-apiv4)**: Multiple security issues in APIv4
'help_text' => NULL,
'validate_callback' => 'CRM_Utils_Rule::color',
],
+ 'requestableMimeTypes' => [
+ 'group_name' => 'CiviCRM Preferences',
+ 'group' => 'core',
+ 'name' => 'requestableMimeTypes',
+ 'type' => 'String',
+ 'html_type' => 'Text',
+ 'default' => 'image/jpeg,image/pjpeg,image/gif,image/x-png,image/png,image/jpg,text/html,application/pdf',
+ 'add' => '5.13',
+ 'title' => ts('Mime Types that can be passed as URL params'),
+ 'is_domain' => 1,
+ 'is_contact' => 0,
+ 'description' => ts('Acceptable Mime Types that can be used as part of file urls'),
+ 'help_text' => NULL,
+ ],
];
LOCK TABLES `civicrm_domain` WRITE;
/*!40000 ALTER TABLE `civicrm_domain` DISABLE KEYS */;
-INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `config_backend`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,NULL,'5.14.alpha1',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
+INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `config_backend`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,NULL,'5.15.alpha1',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
/*!40000 ALTER TABLE `civicrm_domain` ENABLE KEYS */;
UNLOCK TABLES;
</tr>
<tr>
- <td>
- {include file="CRM/Core/DatePickerRange.tpl" fieldName="activity_date_time"}
- </td>
+ {include file="CRM/Core/DatePickerRangeWrapper.tpl" fieldName="activity_date_time" colspan="2"}
+ <td> </td>
</tr>
<tr>
<td>
<p>{ts 1=$docLink}ACLs (Access Control Lists) allow you control access to CiviCRM data. An ACL consists of an <strong>Operation</strong> (e.g. 'View' or 'Edit'), a <strong>set of Data</strong> that the operation can be performed on (e.g. a group of contacts), and a <strong>Role</strong> that has permission to do this operation. Refer to the %1 for more info.{/ts}
{if $config->userSystem->is_drupal EQ '1'}{ts}Note that a CiviCRM ACL Role is not related to the Drupal Role.{/ts}{/if}</p>
<p>{ts}<strong>EXAMPLE:</strong> 'Team Leaders' (<em>ACL Role</em>) can 'Edit' (<em>Operation</em>) all contacts in the 'Active Volunteers Group' (<em>Data</em>).{/ts}</p>
- {if $config->userSystem->is_drupal EQ '1'}
- <p>{ts 1=$ufAccessURL}Use <a href='%1'>Drupal Access Control</a> to manage basic access to CiviCRM components and menu items. Use CiviCRM ACLs to control access to specific CiviCRM contact groups. You can also configure ACLs to grant or deny access to specific Events Profiles, and/or Custom Data Fields.{/ts}</p>
- {elseif $config->userFramework EQ 'Joomla'}
- <p>{ts 1=$ufAccessURL 2=$jAccessParams}Use <a href='%1' %2>Joomla Access Control</a> to manage basic access to CiviCRM components and menu items. Use CiviCRM ACLs to control access to specific CiviCRM contact groups. You can also configure ACLs to grant or deny access to specific Events, Profiles, and/or Custom Data Fields.{/ts}</p>
- {elseif $config->userFramework EQ 'WordPress'}
- <p>{ts 1=$ufAccessURL}Use <a href='%1'>WordPress Access Control</a> to manage basic access to CiviCRM components and menu items. Use CiviCRM ACLs to control access to specific CiviCRM contact groups. You can also configure ACLs to grant or deny access to specific Events, Profiles, and/or Custom Data Fields.{/ts}</p>
- {/if}
+ <p>{ts 1=$ufAccessURL 2=$jAccessParams 3=$config->userFramework}Use <a href='%1' %2>%3 Access Control</a> to manage basic access to CiviCRM components and menu items. Use CiviCRM ACLs to control access to specific CiviCRM contact groups. You can also configure ACLs to grant or deny access to specific Events, Profiles, and/or Custom Data Fields.{/ts}</p>
<p>{ts 1=$config->userFramework}Note that %1 Access Control permissions take precedence over CiviCRM ACLs. If you wish to use CiviCRM ACLs, first disable the related permission in %1 Access control for a user role, and then gradually add ACLs to replace that permission for certain groups of contacts.{/ts}
</div>
<table class="report">
<tr>
- {if $config->userSystem->is_drupal EQ '1'}
- <td class="nowrap"><a href="{$ufAccessURL}" id="adminAccess">» {ts}Drupal Access Control{/ts}</a></td>
+ <td class="nowrap"><a href="{$ufAccessURL}" {$jAccessParams} id="adminAccess">» {ts 1=$config->userFramework}%1 Access Control{/ts}</a></td>
<td>{ts}Grant access to CiviCRM components and other CiviCRM permissions.{/ts}</td>
- {elseif $config->userFramework EQ 'Joomla'}
- <td class="nowrap"><a href="{$ufAccessURL}" {$jAccessParams} id="adminAccess">» {ts}Joomla Access Control{/ts}</a></td>
- <td>{ts}Grant access to CiviCRM components and other CiviCRM permissions.{/ts}</td>
- {elseif $config->userFramework EQ 'WordPress'}
- <td class="nowrap"><a href="{$ufAccessURL}" id="adminAccess">» {ts}WordPress Access Control{/ts}</a></td>
- <td>{ts}Grant access to CiviCRM components and other CiviCRM permissions.{/ts}</td>
- {/if}
</tr>
<tr><td colspan="2" class="separator"><strong>{ts}Use following steps if you need to control View and/or Edit permissions for specific contact groups, specific profiles or specific custom data fields.{/ts}</strong></td></tr>
<tr>
<tr>
<td>{$form.start_date.label}<br/>
- {include file="CRM/common/jcalendar.tpl" elementName=start_date}
+ {$form.start_date.html}
</td>
<td>{$form.end_date.label}<br/>
- {include file="CRM/common/jcalendar.tpl" elementName=end_date}
+ {$form.end_date.html}
</td>
</tr>
});
$(".crm-dedupe-flip-selections").on('click', function(e) {
+ e.preventDefault();
var ids = [];
$('.crm-row-selected').each(function() {
var ele = CRM.$('input.crm-dedupe-select', this);
});
if (ids.length > 0) {
var dataUrl = {/literal}"{crmURL p='civicrm/ajax/flipDupePairs' h=0 q='snippet=4'}"{literal};
- CRM.$.post(dataUrl, {pnid: ids}, function (response) {
+ var request = $.post(dataUrl, {pnid: ids});
+ request.done(function(dt) {
var mapper = {1:3, 2:4, 5:6, 7:8, 9:10}
$('.crm-row-selected').each(function() {
var idx = $('table#dupePairs').DataTable().row(this).index();
// keep the checkbox checked if needed
$('input.crm-dedupe-select', this).prop('checked', $(this).hasClass('crm-row-selected'));
});
- }, 'json');
+ });
}
});
});
<div class="clear"></div>
{if $start_date_editable}
{if $is_date}
- <div class="label">{$form.start_date.label}</div><div class="content">{include file="CRM/common/jcalendar.tpl" elementName=start_date}</div>
+ <div class="label">{$form.start_date.label}</div><div class="content">{$form.start_date.html}</div>
{else}
<div class="label">{$form.start_date.label}</div><div class="content">{$form.start_date.html}</div>
{/if}
</table>
</div>
{if $futurePaymentProcessor}
- <span id="pledge_calendar_date_field"> {include file="CRM/common/jcalendar.tpl" elementName=pledge_calendar_date}</span>
+ <span id="pledge_calendar_date_field"> {$form.pledge_calendar_date.html}</span>
<span id="pledge_calendar_month_field"> {$form.pledge_calendar_month.html}<br/><span class="description">{ts}Recurring payment will be processed this day of the month following submission of this contribution page.{/ts}</span></span>
{/if}
--- /dev/null
+{*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5 |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2018 |
+ +--------------------------------------------------------------------+
+ | 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 |
+ +--------------------------------------------------------------------+
+*}
+{* Wrapper around DatePickerRange TPL file *}
+<td {if $colspan} colspan="{$colspan}" {else} colspan="2" {/if} {if $class} class="{$class}" {/if}>
+ {include file="CRM/Core/DatePickerRange.tpl" fieldName=$fieldName}
+</td>
{foreach from=$line_items item=line_item}
<tr class="event-line-item {$line_item.class}">
<td class="event-title">
- {$line_item.event->title} ({$line_item.event->start_date})
+ {$line_item.event->title} ({$line_item.event->start_date|crmDate})
</td>
<td class="participants-column">
{$line_item.num_participants}<br/>
});
}
else {
- if (elementId.is('select') === true && firstElement.parent().find(':input').select().index() >= 1 && firstElement.parent().find('select').select().index < 1) {
+ if (elementId.is('select') === true && firstElement.parent().find(':input').select().index() >= 1 && firstElement.parent().find('select').select().length > 1) {
// its a multiselect case
firstElement.parent().find(':input').select().each( function(count) {
var firstElementValue = $(this).val();
by button and name. crmBtnType grabs type keyword from button name (e.g. 'upload', 'next', 'back', 'cancel') so
types of buttons can be styled differently via css. *}
{crmRegion name='form-buttons'}
- {foreach from=$form.buttons item=button key=key name=btns}
- {if $key|substring:0:4 EQ '_qf_'}
- {if $location}
- {assign var='html' value=$form.buttons.$key.html|crmReplace:id:"$key-$location"}
- {else}
- {assign var='html' value=$form.buttons.$key.html}
- {/if}
- {crmGetAttribute html=$html attr='crm-icon' assign='icon'}
- {capture assign=iconPrefix}{$icon|truncate:3:"":true}{/capture}
- {if $icon && $iconPrefix eq 'fa-'}
- {assign var='buttonClass' value=' crm-i-button'}
- {capture assign=iconDisp}<i class="crm-i {$icon}"></i>{/capture}
- {elseif $icon}
- {assign var='buttonClass' value=' crm-icon-button'}
- {capture assign=iconDisp}<span class="crm-button-icon ui-icon-{$icon}"> </span>{/capture}
- {/if}
- {crmGetAttribute html=$html attr='disabled' assign='disabled'}
- <span class="crm-button crm-button-type-{$key|crmBtnType} crm-button{$key}{$buttonClass}{if $disabled} crm-button-disabled{/if}"{if $buttonStyle} style="{$buttonStyle}"{/if}>
- {$iconDisp}
- {$html}
- </span>
+{foreach from=$form.buttons item=button key=key name=btns}
+ {if $key|substring:0:4 EQ '_qf_'}
+ {if $location}
+ {assign var='html' value=$form.buttons.$key.html|crmReplace:id:"$key-$location"}
+ {else}
+ {assign var='html' value=$form.buttons.$key.html}
{/if}
- {/foreach}
+ {crmGetAttribute html=$html attr='crm-icon' assign='icon'}
+ {capture assign=iconPrefix}{$icon|truncate:3:"":true}{/capture}
+ {if $icon && $iconPrefix eq 'fa-'}
+ {assign var='buttonClass' value=' crm-i-button'}
+ {capture assign=iconDisp}<i class="crm-i {$icon}"></i>{/capture}
+ {elseif $icon}
+ {assign var='buttonClass' value=' crm-icon-button'}
+ {capture assign=iconDisp}<span class="crm-button-icon ui-icon-{$icon}"> </span>{/capture}
+ {/if}
+ {crmGetAttribute html=$html attr='disabled' assign='disabled'}
+ <span class="crm-button crm-button-type-{$key|crmBtnType} crm-button{$key}{$buttonClass}{if $disabled} crm-button-disabled{/if}"{if $buttonStyle} style="{$buttonStyle}"{/if}>
+ {$iconDisp}
+ {$html}
+ </span>
+ {/if}
+{/foreach}
{/crmRegion}
parent::tearDown();
}
- /**
- * Setup or clean up SMS tests
- * @param bool $teardown
- *
- * @throws \CiviCRM_API3_Exception
- */
- public function setupForSmsTests($teardown = FALSE) {
- require_once 'CiviTest/CiviTestSMSProvider.php';
-
- // Option value params for CiviTestSMSProvider
- $groupID = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', 'sms_provider_name', 'id', 'name');
- $params = array(
- 'option_group_id' => $groupID,
- 'label' => 'unittestSMS',
- 'value' => 'unit.test.sms',
- 'name' => 'CiviTestSMSProvider',
- 'is_default' => 1,
- 'is_active' => 1,
- 'version' => 3,
- );
-
- if ($teardown) {
- // Test completed, delete provider
- $providerOptionValueResult = civicrm_api3('option_value', 'get', $params);
- civicrm_api3('option_value', 'delete', array('id' => $providerOptionValueResult['id']));
- return;
- }
-
- // Create an SMS provider "CiviTestSMSProvider". Civi handles "CiviTestSMSProvider" as a special case and allows it to be instantiated
- // in CRM/Sms/Provider.php even though it is not an extension.
- civicrm_api3('option_value', 'create', $params);
- }
-
/**
* Test case for create() method.
*/
* Test getActivities BAO method for getting count
*/
public function testGetActivitiesCountforNonAdminDashboard() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
$params = array(
'contact_id' => 9,
* Test getActivities BAO method for getting count
*/
public function testGetActivitiesCountforContactSummary() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
$params = array(
'contact_id' => 9,
* CRM-18706 - Test Include/Exclude Activity Filters
*/
public function testActivityFilters() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
Civi::settings()->set('preserve_activity_tab_filter', 1);
$this->createLoggedInUser();
* Test getActivities BAO method for getting count
*/
public function testGetActivitiesCountforContactSummaryWithNoActivities() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
$params = array(
'contact_id' => 17,
* Test getActivities BAO method.
*/
public function testGetActivitiesforNonAdminDashboard() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
$contactID = 9;
$params = array(
'contact_id' => $contactId,
'context' => 'activity',
);
- foreach (array(CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
- //verify target count
- $this->assertEquals($targetCount, $activities[1]['target_contact_counter']);
- $this->assertEquals([$targetContactIDs[0] => 'Anderson, Anthony'], $activities[1]['target_contact_name']);
+ $activities = CRM_Activity_BAO_Activity::getActivities($params);
+ //verify target count
+ $this->assertEquals($targetCount, $activities[1]['target_contact_count']);
+ $this->assertEquals([$targetContactIDs[0] => 'Anderson, Anthony'], $activities[1]['target_contact_name']);
+ $this->assertEquals('Anderson, Anthony', $activities[1]['source_contact_name']);
+ $this->assertEquals('Anderson, Anthony', $activities[1]['assignee_contact_name'][4]);
+ }
+
+ /**
+ * Test getActivities BAO method.
+ */
+ public function testGetActivitiesforContactSummaryWithSortOptions() {
+ $this->createTestActivities();
+ $params = [
+ 'contact_id' => 9,
+ 'admin' => FALSE,
+ 'caseId' => NULL,
+ 'context' => 'activity',
+ 'activity_type_id' => NULL,
+ 'offset' => 0,
+ 'rowCount' => 0,
+ 'sort' => 'source_contact_name desc',
+ ];
+
+ $activities = CRM_Activity_BAO_Activity::getActivities($params);
+ $alphaOrder = ['Test Contact 11', 'Test Contact 12', 'Test Contact 3', 'Test Contact 4', 'Test Contact 9'];
+ foreach ($activities as $activity) {
+ $this->assertEquals(array_pop($alphaOrder), $activity['source_contact_name']);
}
}
/**
* Test getActivities BAO method.
*/
- public function testGetActivitiesforContactSummary() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ public function testGetActivitiesForContactSummary() {
+ $this->createTestActivities();
$contactID = 9;
$params = array(
'activity_type_id' => NULL,
'offset' => 0,
'rowCount' => 0,
- 'sort' => NULL,
);
//since we are loading activities from dataset, we know total number of activities for this contact
// 5 activities, Contact Summary should show all activities
$count = 5;
- foreach (array(CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
-
- $this->assertEquals($count, count($activities));
+ $activities = CRM_Activity_BAO_Activity::getActivities($params);
+ $this->assertEquals($count, count($activities));
+ foreach ($activities as $key => $value) {
+ $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
- foreach ($activities as $key => $value) {
- $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
-
- if ($key > 8) {
- $this->assertEquals($value['status_id'], 2, 'Verify all activities are scheduled.');
- }
- else {
- $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
- }
+ if ($key > 8) {
+ $this->assertEquals($value['status_id'], 2, 'Verify all activities are scheduled.');
+ }
+ else {
+ $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
+ }
- if ($key > 8) {
- $this->assertEquals($value['activity_type_id'], 1, 'Verify activity type is correct.');
- }
- else {
- $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
- }
+ if ($key === 12) {
+ $this->assertEquals($value['activity_type'], 'Bulk Email', 'Verify activity type is correct.');
+ $this->assertEquals('(2 recipients)', $value['recipients']);
+ $targetContactID = key($value['target_contact_name']);
+ // The 2 targets have ids 10 & 11. Since they are not sorted it could be either on some systems.
+ $this->assertTrue(in_array($targetContactID, [10, 11]));
+ }
+ elseif ($key > 8) {
+ $this->assertEquals($value['activity_type_id'], 1, 'Verify activity type is correct.');
+ }
+ else {
+ $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
+ }
- if ($key == 3) {
- $this->assertArrayHasKey($contactID, $value['target_contact_name']);
- }
- elseif ($key == 4) {
- $this->assertArrayHasKey($contactID, $value['assignee_contact_name']);
- }
+ if ($key == 3) {
+ $this->assertEquals([$contactID => 'Test Contact ' . $contactID], $value['target_contact_name']);
+ }
+ elseif ($key == 4) {
+ $this->assertArrayHasKey($contactID, $value['assignee_contact_name']);
}
}
}
* Test getActivities BAO method.
*/
public function testGetActivitiesforContactSummaryWithActivities() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
// parameters for different test cases, check each array key for the specific test-case
$testCases = array(
*/
public function testByActivityDateAndStatus() {
CRM_Core_Config::singleton()->userPermissionClass->permissions = ['view all contacts', 'access CiviCRM'];
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
// activity IDs catagorised by date
$lastWeekActivities = array(1, 2, 3);
* Set up for testing activity queries.
*/
protected function setUpForActivityDashboardTests() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/activities_for_dashboard_count.xml'
- )
- );
+ $this->createTestActivities();
$this->_params = array(
'contact_id' => NULL,
public function testSendSMSWithoutPermission() {
$dummy = NULL;
$session = CRM_Core_Session::singleton();
- $config = &CRM_Core_Config::singleton();
- $config->userPermissionClass->permissions = array('access CiviCRM');
+ CRM_Core_Config::singleton()->userPermissionClass->permissions = array('access CiviCRM');
CRM_Activity_BAO_Activity::sendSMS(
$dummy,
return array($sent, $activityId, $success);
}
+ protected function createTestActivities() {
+ $this->loadXMLDataSet(dirname(__FILE__) . '/activities_for_dashboard_count.xml');
+ // Make changes to improve variation in php since the xml method is brittle & relies on option values being unchanged.
+ $this->callAPISuccess('Activity', 'create', ['id' => 12, 'activity_type_id' => 'Bulk Email']);
+ }
+
}
/**
* Membership type name used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_membershipTypeName = NULL;
/**
* Membership type id used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_membershipTypeID = NULL;
/**
* Contact id used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_contactID = NULL;
/**
* Contact id used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_contactID2 = NULL;
/**
* Contact id used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_contactID3 = NULL;
/**
* Contact id used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_contactID4 = NULL;
CRM_Core_BAO_ConfigSetting::enableComponent('CiviCase');
}
+ /**
+ * Make sure that the latest case activity works accurately.
+ */
+ public function testCaseActivity() {
+ $userID = $this->createLoggedInUser();
+
+ $addTimeline = civicrm_api3('Case', 'addtimeline', [
+ 'case_id' => 1,
+ 'timeline' => "standard_timeline",
+ ]);
+
+ $query = CRM_Case_BAO_Case::getCaseActivityQuery('recent', $userID, ' civicrm_case.id IN( 1 )');
+ $res = CRM_Core_DAO::executeQuery($query);
+ $openCaseType = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Open Case');
+ while ($res->fetch()) {
+ $message = 'Failed asserting that the case activity query has a activity_type_id property:';
+ $this->assertObjectHasAttribute('activity_type_id', $res, $message . PHP_EOL . print_r($res, TRUE));
+ $message = 'Failed asserting that the latest activity from Case ID 1 was "Open Case":';
+ $this->assertEquals($openCaseType, $res->activity_type_id, $message . PHP_EOL . print_r($res, TRUE));
+ }
+ }
+
protected function tearDown() {
parent::tearDown();
$this->quickCleanup($this->tablesToTruncate, TRUE);
/**
* Create and return case object of given Client ID.
* @param $clientId
+ * @param $loggedInUser
* @return CRM_Case_BAO_Case
*/
- private function createCase($clientId) {
+ private function createCase($clientId, $loggedInUser = NULL) {
+ if (empty($loggedInUser)) {
+ // backwards compatibility - but it's more typical that the creator is a different person than the client
+ $loggedInUser = $clientId;
+ }
$caseParams = array(
'activity_subject' => 'Case Subject',
'client_id' => $clientId,
'activity_details' => '',
);
$form = new CRM_Case_Form_Case();
- $caseObj = $form->testSubmit($caseParams, "OpenCase", $clientId, "standalone");
+ $caseObj = $form->testSubmit($caseParams, "OpenCase", $loggedInUser, "standalone");
return $caseObj;
}
* }
*/
+ /**
+ * Test various things after a case is closed.
+ *
+ * This annotation is not ideal, but without it there is some kind of
+ * messup that happens to quickform that persists between tests, e.g.
+ * it can't add maxfilesize validation rules.
+ * @runInSeparateProcess
+ * @preserveGlobalState disabled
+ */
+ public function testCaseClosure() {
+ $loggedInUser = $this->createLoggedInUser();
+ $client_id = $this->individualCreate();
+ $caseObj = $this->createCase($client_id, $loggedInUser);
+ $case_id = $caseObj->id;
+
+ // Get the case status option value for "Resolved" (name="Closed").
+ $closed_status = $this->callAPISuccess('OptionValue', 'getValue', [
+ 'return' => 'value',
+ 'option_group_id' => 'case_status',
+ 'name' => 'Closed',
+ ]);
+ $this->assertNotEmpty($closed_status);
+
+ // Get the activity status option value for "Completed"
+ $completed_status = $this->callAPISuccess('OptionValue', 'getValue', [
+ 'return' => 'value',
+ 'option_group_id' => 'activity_status',
+ 'name' => 'Completed',
+ ]);
+ $this->assertNotEmpty($completed_status);
+
+ // Get the value for the activity type id we need to create
+ $atype = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Change Case Status');
+
+ // Now it gets weird. There doesn't seem to be a good way to test this, so we simulate a form and the various bits that go with it.
+
+ // HTTP vars needed because that's how the form determines stuff
+ $oldMETHOD = empty($_SERVER['REQUEST_METHOD']) ? NULL : $_SERVER['REQUEST_METHOD'];
+ $oldGET = empty($_GET) ? [] : $_GET;
+ $oldREQUEST = empty($_REQUEST) ? [] : $_REQUEST;
+ $_SERVER['REQUEST_METHOD'] = 'GET';
+ $_GET['caseid'] = $case_id;
+ $_REQUEST['caseid'] = $case_id;
+ $_GET['cid'] = $client_id;
+ $_REQUEST['cid'] = $client_id;
+ $_GET['action'] = 'add';
+ $_REQUEST['action'] = 'add';
+ $_GET['reset'] = 1;
+ $_REQUEST['reset'] = 1;
+ $_GET['atype'] = $atype;
+ $_REQUEST['atype'] = $atype;
+
+ $form = new CRM_Case_Form_Activity();
+ $form->controller = new CRM_Core_Controller_Simple('CRM_Case_Form_Activity', 'Case Activity');
+ $form->_activityTypeId = $atype;
+ $form->_activityTypeName = 'Change Case Status';
+ $form->_activityTypeFile = 'ChangeCaseStatus';
+
+ $form->preProcess();
+ $form->buildQuickForm();
+ $form->setDefaultValues();
+
+ // Now submit the form. Store the date used so we can check it later.
+
+ $t = time();
+ $now_date = date('Y-m-d H:i:s', $t);
+ $now_date_date_only = date('Y-m-d', $t);
+ $actParams = [
+ 'is_unittest' => TRUE,
+ 'case_status_id' => $closed_status,
+ 'activity_date_time' => $now_date,
+ 'target_contact_id' => $client_id,
+ 'source_contact_id' => $loggedInUser,
+ 'subject' => 'null', // yeah this is extra weird, but without it you get the wrong subject
+ ];
+
+ $form->postProcess($actParams);
+
+ // Ok now let's check some things
+
+ $result = $this->callAPISuccess('Case', 'get', [
+ 'sequential' => 1,
+ 'id' => $case_id,
+ ]);
+ $caseData = array_shift($result['values']);
+
+ $this->assertEquals($caseData['end_date'], $now_date_date_only);
+ $this->assertEquals($caseData['status_id'], $closed_status);
+
+ // now get the latest activity and check some things for it
+
+ $actId = max($caseData['activities']);
+ $this->assertNotEmpty($actId);
+
+ $result = $this->callAPISuccess('Activity', 'get', [
+ 'sequential' => 1,
+ 'id' => $actId,
+ ]);
+ $activity = array_shift($result['values']);
+
+ $this->assertEquals($activity['subject'], 'Case status changed from Ongoing to Resolved');
+ $this->assertEquals($activity['activity_date_time'], $now_date);
+ $this->assertEquals($activity['status_id'], $completed_status);
+
+ // Now replace old globals
+ if (is_null($oldMETHOD)) {
+ unset($_SERVER['REQUEST_METHOD']);
+ }
+ else {
+ $_SERVER['REQUEST_METHOD'] = $oldMETHOD;
+ }
+ $_GET = $oldGET;
+ $_REQUEST = $oldREQUEST;
+ }
+
}
parent::setUp();
}
+ /**
+ * Clean up after test.
+ *
+ * @throws \Exception
+ */
public function tearDown() {
$this->quickCleanUpFinancialEntities();
- $tablesToTruncate = array(
+ $tablesToTruncate = [
'civicrm_group_contact',
'civicrm_group',
'civicrm_saved_search',
'civicrm_tag',
'civicrm_contact',
'civicrm_address',
- );
+ ];
$this->quickCleanup($tablesToTruncate);
}
* @param $full
*/
public function testSearch($fv, $count, $ids, $full) {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/queryDataset.xml'
- )
- );
+ $this->callAPISuccess('SavedSearch', 'create', ['form_values' => 'a:9:{s:5:"qfKey";s:32:"0123456789abcdef0123456789abcdef";s:13:"includeGroups";a:1:{i:0;s:1:"3";}s:13:"excludeGroups";a:0:{}s:11:"includeTags";a:0:{}s:11:"excludeTags";a:0:{}s:4:"task";s:2:"14";s:8:"radio_ts";s:6:"ts_all";s:14:"customSearchID";s:1:"4";s:17:"customSearchClass";s:36:"CRM_Contact_Form_Search_Custom_Group";}']);
+ $this->callAPISuccess('SavedSearch', 'create', ['form_values' => 'a:9:{s:5:"qfKey";s:32:"0123456789abcdef0123456789abcdef";s:13:"includeGroups";a:1:{i:0;s:1:"3";}s:13:"excludeGroups";a:0:{}s:11:"includeTags";a:0:{}s:11:"excludeTags";a:0:{}s:4:"task";s:2:"14";s:8:"radio_ts";s:6:"ts_all";s:14:"customSearchID";s:1:"4";s:17:"customSearchClass";s:36:"CRM_Contact_Form_Search_Custom_Group";}']);
+
+ $tag7 = $this->ids['Tag'][7] = $this->tagCreate(['name' => 'Test Tag 7', 'description' => 'Test Tag 7'])['id'];
+ $tag9 = $this->ids['Tag'][9] = $this->tagCreate(['name' => 'Test Tag 9', 'description' => 'Test Tag 9'])['id'];
+ $this->tagCreate(['name' => 'Test Tag 10']);
+ $groups = [
+ 3 => ['name' => 'Test Group 3'],
+ 4 => ['name' => 'Test Smart Group 4', 'saved_search_id' => 1],
+ 5 => ['name' => 'Test Group 5'],
+ 6 => ['name' => 'Test Smart Group 6', 'saved_search_id' => 2],
+ ];
+
+ foreach ($groups as $id => $group) {
+ $this->ids['Group'][$id] = $this->groupCreate(array_merge($group, ['title' => $group['name']]));
+ }
+ $individuals = [
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 9', 'gender_id' => 1, 'prefix_id' => 1, 'suffix_id' => 1],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 10', 'gender_id' => 2, 'prefix_id' => 2, 'suffix_id' => 2, 'api.entity_tag.create' => ['tag_id' => $tag9]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 11', 'gender_id' => 3, 'prefix_id' => 3, 'suffix_id' => 3, 'api.entity_tag.create' => ['tag_id' => $tag7]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 12', 'gender_id' => 3, 'prefix_id' => 4, 'suffix_id' => 4, 'api.entity_tag.create' => ['tag_id' => $tag9], 'api.entity_tag.create.2' => ['tag_id' => $tag7]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 13', 'gender_id' => 2, 'prefix_id' => 2, 'suffix_id' => 2],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 14', 'gender_id' => 3, 'prefix_id' => 4, 'suffix_id' => 4, 'api.entity_tag.create' => ['tag_id' => $tag9]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 15', 'gender_id' => 3, 'prefix_id' => 4, 'suffix_id' => 5, 'api.entity_tag.create' => ['tag_id' => $tag7]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 16', 'gender_id' => 3, 'prefix_id' => 4, 'suffix_id' => 6, 'api.entity_tag.create' => ['tag_id' => $tag9], 'api.entity_tag.create.2' => ['tag_id' => $tag7]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 17', 'gender_id' => 2, 'prefix_id' => 4, 'suffix_id' => 7],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 18', 'gender_id' => 2, 'prefix_id' => 4, 'suffix_id' => 4, 'api.entity_tag.create' => ['tag_id' => $tag9]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 19', 'gender_id' => 2, 'prefix_id' => 4, 'suffix_id' => 6, 'api.entity_tag.create.2' => ['tag_id' => $tag7]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 20', 'gender_id' => 1, 'prefix_id' => 4, 'suffix_id' => 6, 'api.entity_tag.create' => ['tag_id' => $tag9], 'api.entity_tag.create.2' => ['tag_id' => $tag7]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 21', 'gender_id' => 3, 'prefix_id' => 1, 'suffix_id' => 6],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 22', 'gender_id' => 1, 'prefix_id' => 1, 'suffix_id' => 1, 'api.entity_tag.create' => ['tag_id' => $tag9]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 23', 'gender_id' => 3, 'prefix_id' => 1, 'suffix_id' => 1, 'api.entity_tag.create' => ['tag_id' => $tag7]],
+ ['first_name' => 'Test', 'last_name' => 'Test Contact 24', 'gender_id' => 3, 'prefix_id' => 3, 'suffix_id' => 2, 'api.entity_tag.create' => ['tag_id' => $tag9], 'api.entity_tag.create.2' => ['tag_id' => $tag7]],
+ ];
+ foreach ($individuals as $individual) {
+ $this->ids['Contact'][$individual['last_name']] = $this->individualCreate($individual);
+ }
+ $groupContacts = [
+ [5 => 13],
+ [5 => 14],
+ [5 => 15],
+ [5 => 16],
+ [5 => 21],
+ [5 => 22],
+ [5 => 23],
+ [5 => 24],
+ [3 => 17],
+ [3 => 18],
+ [3 => 19],
+ [3 => 20],
+ [3 => 21],
+ [3 => 22],
+ [3 => 23],
+ [3 => 24],
+ ];
+ foreach ($groupContacts as $group) {
+ $groupID = $this->ids['Group'][key($group)];
+ $contactID = $this->ids['Contact']['Test Contact ' . reset($group)];
+ $this->callAPISuccess('GroupContact', 'create', ['group_id' => $groupID, 'contact_id' => $contactID, 'status' => 'Added']);
+ }
+
+ // We have migrated from a hard-coded dataset to a dynamic one but are still working with the same
+ // dataprovider at this stage -> wrangle.
+ foreach ($fv as $key => $value) {
+ $entity = ucfirst($key);
+ if (!array_key_exists($entity, $this->ids)) {
+ continue;
+ }
+ if (is_numeric($value)) {
+ $fv[$key] = $this->ids[$entity][$value];
+ }
+ elseif (!empty($value[0])) {
+ foreach ($value as $index => $oldGroup) {
+ $fv[$key][$index] = $this->ids[$entity][$oldGroup];
+ }
+ }
+ else {
+ foreach (array_keys($value) as $index) {
+ unset($fv[$key][$index]);
+ $fv[$key][$this->ids[$entity][$index]] = 1;
+ }
+ }
+ }
$params = CRM_Contact_BAO_Query::convertFormValues($fv);
$obj = new CRM_Contact_BAO_Query($params);
$dao = $obj->searchQuery();
- $contacts = array();
+ $contacts = [];
while ($dao->fetch()) {
$contacts[] = $dao->contact_id;
}
sort($contacts, SORT_NUMERIC);
- $this->assertEquals($ids, $contacts);
+ $expectedIDs = [];
+ foreach ($ids as $id) {
+ $expectedIDs[] = $this->ids['Contact']['Test Contact ' . $id];
+ }
+ $this->assertEquals($expectedIDs, $contacts);
}
/**
$this->assertEquals($where2, $sql5[2]);
}
+ /**
+ * Test we can narrow a group get by status.
+ */
+ public function testGetByGroupWithStatus() {
+ $groupID = $this->groupCreate();
+ $this->groupContactCreate($groupID, 3);
+ $groupContactID = $this->callAPISuccessGetSingle('GroupContact', ['group_id' => $groupID, 'options' => ['limit' => 1]])['id'];
+ $this->callAPISuccess('GroupContact', 'create', ['id' => $groupContactID, 'status' => 'Removed']);
+ $queryObj = new CRM_Contact_BAO_Query([['group', '=', $groupID, 0, 0], ['group_contact_status', 'IN', ['Removed' => 1], 0, 0]]);
+ $resultDAO = $queryObj->searchQuery();
+ $this->assertEquals(1, $resultDAO->N);
+
+ $queryObj = new CRM_Contact_BAO_Query([['group', '=', $groupID, 0, 0], ['group_contact_status', 'IN', ['Added' => 1], 0, 0]]);
+ $resultDAO = $queryObj->searchQuery();
+ $this->assertEquals(2, $resultDAO->N);
+
+ $queryObj = new CRM_Contact_BAO_Query([['group', '=', $groupID, 0, 0]]);
+ $resultDAO = $queryObj->searchQuery();
+ $this->assertEquals(2, $resultDAO->N);
+ }
+
/**
* Test the group contact clause does not contain an OR.
*
class CRM_Contact_BAO_QueryTestDataProvider implements Iterator {
/**
- * @var integer
+ * Current count.
+ *
+ * @var int
*/
private $i = 0;
public function testCount($fv, $count, $ids, $full) {
$this->quickCleanup($this->_tablesToTruncate);
- // echo "testCount\n";
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/datasets/group-dataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/datasets/group-dataset.xml');
$obj = new CRM_Contact_Form_Search_Custom_Group($fv);
* echo "{$dao->contact_id}, {$dao->contact_type}, {$dao->sort_name}, {$dao->group_names}\n";
* }
**/
- $this->assertEquals($count, $obj->count(),
- 'In line ' . __LINE__
- );
+ $this->assertEquals($count, $obj->count());
}
/**
public function testAll($fv, $count, $ids, $full) {
// Truncate affected tables
$this->quickCleanup($this->_tablesToTruncate);
+ $this->loadXMLDataSet(dirname(__FILE__) . '/datasets/group-dataset.xml');
- // echo "testAll\n";
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/datasets/group-dataset.xml'
- )
- );
$obj = new CRM_Contact_Form_Search_Custom_Group($fv);
$sql = $obj->all();
$this->assertTrue(is_string($sql));
// Truncate affected tables
$this->quickCleanup($this->_tablesToTruncate);
- // echo "testContactIDs\n";
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/datasets/group-dataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/datasets/group-dataset.xml');
+
$obj = new CRM_Contact_Form_Search_Custom_Group($fv);
$sql = $obj->contactIDs();
$this->assertTrue(is_string($sql));
class CRM_Contact_Form_Search_Custom_GroupTestDataProvider implements Iterator {
/**
- * @var integer
+ * Current count.
+ *
+ * @var int
*/
private $i = 0;
public function testCount($fv, $count, $ids, $full) {
$this->quickCleanup($this->_tablesToTruncate);
- // echo "testCount\n";
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/datasets/sample-dataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/datasets/sample-dataset.xml');
$obj = new CRM_Contact_Form_Search_Custom_Sample($fv);
- $this->assertEquals($count, $obj->count(),
- 'In line ' . __LINE__
- );
+ $this->assertEquals($count, $obj->count());
}
/**
// Truncate affected tables
$this->quickCleanup($this->_tablesToTruncate);
- // echo "testAll\n";
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/datasets/sample-dataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/datasets/sample-dataset.xml');
+
$obj = new CRM_Contact_Form_Search_Custom_Sample($fv);
$sql = $obj->all(0, 0, 'contact_id');
$this->assertTrue(is_string($sql));
// Truncate affected tables
$this->quickCleanup($this->_tablesToTruncate);
- // echo "testContactIDs\n";
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/datasets/sample-dataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/datasets/sample-dataset.xml');
$obj = new CRM_Contact_Form_Search_Custom_Sample($fv);
$sql = $obj->contactIDs();
$this->assertTrue(is_string($sql));
public function testSavedSearch() {
$this->quickCleanup($this->_tablesToTruncate);
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/datasets/sample-dataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/datasets/sample-dataset.xml');
$dataset[1] = array('id' => array(12));
$dataset[2] = array('id' => array(10, 11));
class CRM_Contact_Form_Search_Custom_SampleTestDataProvider implements Iterator {
/**
- * @var integer
+ * Current count.
+ *
+ * @var int
*/
private $i = 0;
* @group headless
*/
class CRM_Contact_Import_Parser_ContactTest extends CiviUnitTestCase {
- protected $_tablesToTruncate = ['civicrm_address', 'civicrm_phone'];
+ protected $_tablesToTruncate = ['civicrm_address', 'civicrm_phone', 'civicrm_email'];
/**
* Setup function.
$contactValues['external_identifier'] = 'android';
$contactValues['street_address'] = 'Big Mansion';
$contactValues['phone'] = 12334;
- $this->runImport($contactValues, CRM_Import_Parser::DUPLICATE_UPDATE, CRM_Import_Parser::VALID, array(0 => NULL, 1 => NULL, 2 => NULL, 3 => NULL, 4 => NULL, 5 => 'Primary', 6 => 'Primary'));
+ $this->runImport($contactValues, CRM_Import_Parser::DUPLICATE_UPDATE, CRM_Import_Parser::VALID, array(0 => NULL, 1 => NULL, 2 => 'Primary', 3 => NULL, 4 => NULL, 5 => 'Primary', 6 => 'Primary'));
$address = $this->callAPISuccessGetSingle('Address', array('street_address' => 'Big Mansion'));
$this->assertEquals(1, $address['location_type_id']);
$this->assertEquals(1, $address['is_primary']);
- $this->markTestIncomplete('phone actually doesn\'t work');
$phone = $this->callAPISuccessGetSingle('Phone', array('phone' => '12334'));
$this->assertEquals(1, $phone['location_type_id']);
+ $this->callAPISuccessGetSingle('Email', array('email' => 'bill.gates@microsoft.com'));
+
$contact = $this->callAPISuccessGetSingle('Contact', $contactValues);
$this->callAPISuccess('Contact', 'delete', array('id' => $contact['id']));
}
+ /**
+ * Test that address custom fields can be imported
+ */
+ public function testAddressWithCustomData() {
+ $ids = $this->entityCustomGroupWithSingleFieldCreate('Address', 'AddressTest.php');
+ list($contactValues) = $this->setUpBaseContact();
+ $contactValues['nick_name'] = 'Old Bill';
+ $contactValues['external_identifier'] = 'android';
+ $contactValues['street_address'] = 'Big Mansion';
+ $contactValues['custom_' . $ids['custom_field_id']] = 'Update';
+ $this->runImport($contactValues, CRM_Import_Parser::DUPLICATE_UPDATE, CRM_Import_Parser::VALID, array(0 => NULL, 1 => NULL, 2 => NULL, 3 => NULL, 4 => NULL, 5 => 'Primary', 6 => 'Primary'));
+ $address = $this->callAPISuccessGetSingle('Address', ['street_address' => 'Big Mansion', 'return' => 'custom_' . $ids['custom_field_id']]);
+ $this->assertEquals('Update', $address['custom_' . $ids['custom_field_id']]);
+ }
+
/**
* Test that the import parser adds the address to the primary location.
*
$this->assertEquals(1, $address['values'][1]['is_primary']);
$this->assertEquals('Big Mansion', $address['values'][1]['street_address']);
- $this->markTestIncomplete('phone import primary actually IS broken');
$phone = $this->callAPISuccess('Phone', 'get', array('contact_id' => $contact['id'], 'sequential' => 1));
$this->assertEquals(1, $phone['values'][0]['location_type_id']);
$this->assertEquals(1, $phone['values'][0]['is_primary']);
$this->assertEquals(0, $address[0]['is_primary']);
$this->assertEquals('Big Mansion', $address[0]['street_address']);
- $this->markTestIncomplete('phone import primary actually IS broken');
- $phone = $this->callAPISuccess('Phone', 'get', array('contact_id' => $contact['id'], 'sequential' => 1))['values'];
+ $phone = $this->callAPISuccess('Phone', 'get', ['contact_id' => $contact['id'], 'sequential' => 1, 'options' => ['sort' => 'is_primary DESC']])['values'];
$this->assertEquals(3, $phone[1]['location_type_id']);
$this->assertEquals(0, $phone[1]['is_primary']);
$this->assertEquals(12334, $phone[1]['phone']);
*/
public function testImportPrimaryAddressUpdate() {
list($contactValues) = $this->setUpBaseContact(array('external_identifier' => 'android'));
- $contactValues['nick_name'] = 'Old Bill';
+ $contactValues['email'] = 'melinda.gates@microsoft.com';
+ $contactValues['phone'] = '98765';
$contactValues['external_identifier'] = 'android';
$contactValues['street_address'] = 'Big Mansion';
$contactValues['city'] = 'Big City';
$contactID = $this->callAPISuccessGetValue('Contact', array('external_identifier' => 'android', 'return' => 'id'));
$originalAddress = $this->callAPISuccess('Address', 'create', array('location_type_id' => 2, 'street_address' => 'small house', 'contact_id' => $contactID));
- $this->runImport($contactValues, CRM_Import_Parser::DUPLICATE_UPDATE, CRM_Import_Parser::VALID, array(0 => NULL, 1 => NULL, 2 => NULL, 3 => NULL, 4 => NULL, 5 => 'Primary', 6 => 'Primary'));
+ $originalPhone = $this->callAPISuccess('phone', 'create', array('location_type_id' => 2, 'phone' => '1234', 'contact_id' => $contactID));
+ $this->runImport($contactValues, CRM_Import_Parser::DUPLICATE_UPDATE, CRM_Import_Parser::VALID, array(0 => NULL, 1 => NULL, 2 => 'Primary', 3 => NULL, 4 => NULL, 5 => 'Primary', 6 => 'Primary', 7 => 'Primary'));
+ $phone = $this->callAPISuccessGetSingle('Phone', ['phone' => '98765']);
+ $this->assertEquals(2, $phone['location_type_id']);
+ $this->assertEquals($originalPhone['id'], $phone['id']);
+ $email = $this->callAPISuccess('Email', 'getsingle', ['contact_id' => $contactID]);
$address = $this->callAPISuccessGetSingle('Address', array('street_address' => 'Big Mansion'));
$this->assertEquals(2, $address['location_type_id']);
$this->assertEquals($originalAddress['id'], $address['id']);
--- /dev/null
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5 |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2019 |
+ +--------------------------------------------------------------------+
+ | 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 |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Test class for CRM_Contact_Page_DedupeException BAO
+ *
+ * @package CiviCRM
+ * @group headless
+ */
+class CRM_Contact_Page_DedupeExceptionTest extends CiviUnitTestCase {
+
+ /**
+ * Sets up the fixture, for example, opens a network connection.
+ * This method is called before a test is executed.
+ */
+ protected function setUp() {
+ parent::setUp();
+ }
+
+ /**
+ * Tears down the fixture, for example, closes a network connection.
+ *
+ * This method is called after a test is executed.
+ */
+ protected function tearDown() {
+ parent::tearDown();
+ }
+
+ public function testGetDedupeExceptions() {
+ $contact1 = $this->individualCreate();
+ $contact2 = $this->individualCreate();
+ $exception = $this->callAPISuccess('Exception', 'create', [
+ 'contact_id1' => $contact1,
+ 'contact_id2' => $contact2,
+ ]);
+ $page = new CRM_Contact_Page_DedupeException();
+ $totalitems = civicrm_api3('Exception', "getcount", []);
+ $params = array(
+ 'total' => $totalitems,
+ 'rowCount' => CRM_Utils_Pager::ROWCOUNT,
+ 'status' => ts('Dedupe Exceptions %%StatusMessage%%'),
+ 'buttonBottom' => 'PagerBottomButton',
+ 'buttonTop' => 'PagerTopButton',
+ 'pageID' => $page->get(CRM_Utils_Pager::PAGE_ID),
+ );
+ $page->_pager = new CRM_Utils_Pager($params);
+ $exceptions = $page->getExceptions();
+ $expectedArray = [
+ $exception['id'] => [
+ 'id' => $exception['id'],
+ 'contact_id1.display_name' => 'Mr. Anthony Anderson II',
+ 'contact_id2.display_name' => 'Mr. Anthony Anderson II',
+ 'contact_id1' => $contact1,
+ 'contact_id2' => $contact2,
+ ],
+ ];
+ $this->assertEquals($expectedArray, $exceptions);
+ }
+
+}
--- /dev/null
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5 |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2019 |
+ +--------------------------------------------------------------------+
+ | 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 |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Test class for CRM_Contact_Page_View_Note BAO
+ *
+ * @package CiviCRM
+ * @group headless
+ */
+class CRM_Contact_Page_View_NoteTest extends CiviUnitTestCase {
+
+ /**
+ * Sets up the fixture, for example, opens a network connection.
+ * This method is called before a test is executed.
+ */
+ protected function setUp() {
+ parent::setUp();
+ }
+
+ /**
+ * Tears down the fixture, for example, closes a network connection.
+ *
+ * This method is called after a test is executed.
+ */
+ protected function tearDown() {
+ parent::tearDown();
+ }
+
+ public function testNoContactIdNote() {
+ $contactId = $this->individualCreate();
+ foreach ([1, 2, 3, 4, 5] as $noteID) {
+ $note = new CRM_Core_DAO_Note();
+ $note->entity_id = $contactId;
+ $note->subject = 'Test Note ' . $noteID;
+ $note->note = 'Test Note from Tests';
+ $note->entity_table = 'civicrm_contact';
+ if ($noteID == 5) {
+ $note->contact_id = $contactId;
+ }
+ $note->save();
+ }
+ $page = new CRM_Contact_Page_View_Note();
+ $page->_contactId = $contactId;
+ $page->_permission = CRM_Core_PERMISSION::EDIT;
+ $page->browse();
+ $this->assertEquals(count($page->values), 5);
+ foreach ($page->values as $note) {
+ $this->assertEquals($note['entity_id'], $contactId);
+ if ($note['id'] == 5) {
+ $this->assertEquals($note['createdBy'], 'Mr. Anthony Anderson II');
+ }
+ }
+ }
+
+}
$this->assertEquals("$ 200.00 - STUDENT", $activity->subject, 'Check for total amount in activity.');
}
- /**
- * Test checkContributeSettings.
- */
- public function testCheckContributeSettings() {
- $settings = CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled');
- $this->assertNull($settings);
- $params = array(
- 'contribution_invoice_settings' => array(
- 'deferred_revenue_enabled' => '1',
- ),
- );
- $this->callAPISuccess('Setting', 'create', $params);
- $settings = CRM_Contribute_BAO_Contribution::checkContributeSettings('deferred_revenue_enabled');
- $this->assertEquals($settings, 1, 'Check for settings has failed');
- }
-
/**
* Test allowUpdateRevenueRecognitionDate.
*/
), $checkAgainst);
}
+ /**
+ * https://lab.civicrm.org/dev/financial/issues/56
+ * Changing financial type on a contribution records correct financial items
+ */
+ public function testChangingFinancialTypeWithoutTax() {
+ $ids = $values = [];
+ $contactId = $this->individualCreate();
+ $params = array(
+ 'contact_id' => $contactId,
+ 'receive_date' => date('YmdHis'),
+ 'total_amount' => 100.00,
+ 'financial_type_id' => 'Donation',
+ 'contribution_status_id' => 'Completed',
+ );
+ /* first test the scenario when sending an email */
+ $contributionId = $this->callAPISuccess(
+ 'contribution',
+ 'create',
+ $params
+ )['id'];
+
+ // Update Financial Type.
+ $this->callAPISuccess('contribution', 'create', [
+ 'id' => $contributionId,
+ 'financial_type_id' => 'Event Fee',
+ ]);
+
+ // Get line item
+ $lineItem = $this->callAPISuccessGetSingle('LineItem', [
+ 'contribution_id' => $contributionId,
+ 'return' => ["financial_type_id.name", "line_total"],
+ ]);
+
+ $this->assertEquals(
+ $lineItem['line_total'],
+ 100.00,
+ 'Invalid line amount.'
+ );
+
+ $this->assertEquals(
+ $lineItem['financial_type_id.name'],
+ 'Event Fee',
+ 'Invalid Financial Type stored.'
+ );
+
+ // Get Financial Items.
+ $financialItems = $this->callAPISuccess('FinancialItem', 'get', [
+ 'entity_id' => $lineItem['id'],
+ 'sequential' => 1,
+ 'entity_table' => 'civicrm_line_item',
+ 'options' => ['sort' => "id"],
+ 'return' => ["financial_account_id.name", "amount", "description"],
+ ]);
+
+ $this->assertEquals($financialItems['count'], 3, 'Count mismatch.');
+
+ $toCheck = [
+ ['Donation', 100.00],
+ ['Donation', -100.00],
+ ['Event Fee', 100.00],
+ ];
+
+ foreach ($financialItems['values'] as $key => $values) {
+ $this->assertEquals(
+ $values['financial_account_id.name'],
+ $toCheck[$key][0],
+ 'Invalid Financial Account stored.'
+ );
+ $this->assertEquals(
+ $values['amount'],
+ $toCheck[$key][1],
+ 'Amount mismatch.'
+ );
+ $this->assertEquals(
+ $values['description'],
+ 'Contribution Amount',
+ 'Description mismatch.'
+ );
+ }
+
+ // Check transactions.
+ $financialTransactions = $this->callAPISuccess('EntityFinancialTrxn', 'get', [
+ 'return' => ["financial_trxn_id"],
+ 'entity_table' => "civicrm_contribution",
+ 'entity_id' => $contributionId,
+ 'sequential' => 1,
+ ]);
+ $this->assertEquals($financialTransactions['count'], 3, 'Count mismatch.');
+
+ foreach ($financialTransactions['values'] as $key => $values) {
+ $this->callAPISuccessGetCount('EntityFinancialTrxn', [
+ 'financial_trxn_id' => $values['financial_trxn_id'],
+ 'amount' => $toCheck[$key][1],
+ 'financial_trxn_id.total_amount' => $toCheck[$key][1],
+ ], 2);
+ }
+ }
+
/**
* CRM-21424 Check if the receipt update is set after composing the receipt message
*/
/**
* Test the submit function that completes the partially paid Contribution with multiple payments.
*/
- public function testMultiplePaymentForPartialyPaidContribution() {
+ public function testMultiplePaymentForPartiallyPaidContribution() {
$this->createContribution('Partially paid');
// pay additional amount
// pay additional amount
$this->submitPayment(20);
$this->checkResults(array(30, 50, 20), 3);
+ $activities = $this->callAPISuccess('Activity', 'get', [
+ 'source_record_id' => $this->_contributionId,
+ 'activity_type_id' => 'Payment',
+ 'options' => ['sort' => 'id'],
+ 'sequential' => 1,
+ 'return' => ['target_contact_id', 'assignee_contact_id', 'subject'],
+ ])['values'];
+ $this->assertEquals(2, count($activities));
+ $this->assertEquals('$ 50.00 - Offline Payment for Contribution', $activities[0]['subject']);
+ $this->assertEquals('$ 20.00 - Offline Payment for Contribution', $activities[1]['subject']);
+ $this->assertEquals(CRM_Core_Session::singleton()->getLoggedInContactID(), $activities[0]['source_contact_id']);
+ $this->assertEquals([$this->_individualId], $activities[0]['target_contact_id']);
+ $this->assertEquals([], $activities[0]['assignee_contact_id']);
}
/**
*
* @dataProvider getSearchData
*/
- public function testContributionRecurStatusFilter($formValues, $expectedCount, $expectedContact, $expectedQill) {
+ public function testContributionRecurSearchFilters($formValues, $expectedCount, $expectedContact, $expectedQill) {
$this->setUpRecurringContributions();
$query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($formValues));
'sequential' => 1,
'contact_id' => $this->ids['Contact']['contactID2'],
'frequency_interval' => 1,
- 'frequency_unit' => "month",
+ 'frequency_unit' => 'month',
'amount' => 22,
'currency' => "CAD",
'payment_instrument_id' => 1,
'contribution_status_id' => 1,
- 'financial_type_id' => "Donation",
+ 'financial_type_id' => 'Donation',
+ 'trxn_id' => 'a transaction',
+ 'processor_id' => 'a processor',
]);
$Contribution2 = $this->callAPISuccess('Contribution', 'create', [
'financial_type_id' => 'Donation',
'expected_contact' => [],
'expected_qill' => "Recurring Contribution Status = 'Cancelled'",
],
+ 'trxn_id_search' => [
+ 'form_value' => ['contribution_recur_trxn_id' => 'a transaction'],
+ 'expected_count' => 1,
+ 'expected_contact' => ['Mr. Terrence Smith II'],
+ 'expected_qill' => "Recurring Contribution Transaction ID = 'a transaction'",
+ ],
+ 'processor_id_search' => [
+ 'form_value' => ['contribution_recur_processor_id' => 'a processor'],
+ 'expected_count' => 1,
+ 'expected_contact' => ['Mr. Terrence Smith II'],
+ 'expected_qill' => "Recurring Contribution Processor ID = 'a processor'",
+ ],
];
return $useCases;
}
* AllIMs() method - get all IMs for our contact, with primary IM first
*/
public function testAllIMs() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute(
- $this->_dbconn,
- $this->createFlatXMLDataSet(dirname(__FILE__) . '/dataset/im_test.xml')
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/dataset/im_test.xml');
$contactId = 69;
$IMs = CRM_Core_BAO_IM::allIMs($contactId);
$this->assertDBCompareValues('CRM_Friend_DAO_Friend', $searchActParams, $compareActParams);
}
+ /**
+ * Testing Activity Generation through Entity Recursion with Custom Data and Tags.
+ */
+ public function testRecurringEntityGenerationWithCustomDataAndTags() {
+
+ // Create custom group and field
+ $customGroup = $this->customGroupCreate([
+ 'extends' => 'Activity',
+ ]);
+ $customField = $this->customFieldCreate([
+ 'custom_group_id' => $customGroup['id'],
+ 'default_value' => '',
+ ]
+ );
+
+ // Create activity Tag
+ $tag = $this->tagCreate([
+ 'used_for' => 'Activities',
+ ]);
+
+ // Create original activity
+ $customFieldValue = 'Custom Value';
+ $activityDateTime = date('YmdHis');
+ $activityId = $this->activityCreate([
+ 'activity_date_time' => $activityDateTime,
+ 'custom_' . $customField['id'] => $customFieldValue,
+ ]);
+
+ $activityId = $activityId['id'];
+
+ // Assign tag to a activity.
+ $this->callAPISuccess('EntityTag', 'create', [
+ 'entity_table' => 'civicrm_activity',
+ 'entity_id' => $activityId,
+ 'tag_id' => $tag['id'],
+ ]);
+
+ // Create recurring activities.
+ $recursion = new CRM_Core_BAO_RecurringEntity();
+ $recursion->entity_id = $activityId;
+ $recursion->entity_table = 'civicrm_activity';
+ $recursion->dateColumns = ['activity_date_time'];
+ $recursion->schedule = [
+ 'entity_value' => $activityId,
+ 'start_action_date' => $activityDateTime,
+ 'entity_status' => 'fourth saturday',
+ 'repetition_frequency_unit' => 'month',
+ 'repetition_frequency_interval' => 3,
+ 'start_action_offset' => 3,
+ 'used_for' => 'activity',
+ ];
+
+ $generatedEntities = $recursion->generate();
+ $generatedActivities = $generatedEntities['civicrm_activity'];
+
+ $this->assertEquals(3, count($generatedActivities), "Check if number of iterations are 3");
+
+ foreach ($generatedActivities as $generatedActivityId) {
+
+ /* Validate tag in recurring activity
+ // @todo - refer https://github.com/civicrm/civicrm-core/pull/13470
+ $this->callAPISuccess('EntityTag', 'getsingle', [
+ 'entity_table' => 'civicrm_activity',
+ 'entity_id' => $generatedActivityId,
+ ]);
+ */
+
+ // Validate custom data in recurring activity
+ $activity = $this->callAPISuccess('activity', 'getsingle', [
+ 'return' => [
+ 'custom_' . $customField['id'],
+ ],
+ 'id' => $generatedActivityId,
+ ]);
+
+ $this->assertEquals($customFieldValue, $activity['custom_' . $customField['id']], 'Custom field value should be ' . $customFieldValue);
+
+ }
+ }
+
}
public function testHookCron() {
$mockFunction = $this->mockMethod;
- $hook = $this->$mockFunction('stdClass', array('civicrm_cron'));
+ $hook = $this->getMockBuilder(stdClass::class)
+ ->setMethods(['civicrm_cron'])
+ ->getMock();
$hook->expects($this->once())
->method('civicrm_cron')
->with($this->isInstanceOf('CRM_Core_JobManager'));
/**
* Class CRM_Dedupe_DedupeMergerTest
+ *
* @group headless
*/
class CRM_Dedupe_MergerTest extends CiviUnitTestCase {
protected $_groupId;
- protected $_contactIds = array();
+ protected $_contactIds = [];
+
+ /**
+ * Tear down.
+ *
+ * @throws \Exception
+ */
public function tearDown() {
- $this->quickCleanup(array('civicrm_contact', 'civicrm_group_contact', 'civicrm_group'));
+ $this->quickCleanup([
+ 'civicrm_contact',
+ 'civicrm_group_contact',
+ 'civicrm_group',
+ ]);
parent::tearDown();
}
public function createDupeContacts() {
// create a group to hold contacts, so that dupe checks don't consider any other contacts in the DB
- $params = array(
- 'name' => 'Test Dupe Merger Group',
- 'title' => 'Test Dupe Merger Group',
- 'domain_id' => 1,
- 'is_active' => 1,
+ $params = [
+ 'name' => 'Test Dupe Merger Group',
+ 'title' => 'Test Dupe Merger Group',
+ 'domain_id' => 1,
+ 'is_active' => 1,
'visibility' => 'Public Pages',
- );
+ ];
$result = $this->callAPISuccess('group', 'create', $params);
$this->_groupId = $result['id'];
// will - dale - dale@example.com
// will - dale - will@example.com
// will - dale - will@example.com
- $params = array(
- array(
+ $params = [
+ [
'first_name' => 'robin',
'last_name' => 'hood',
'email' => 'robin@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'robin',
'last_name' => 'hood',
'email' => 'robin@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'robin',
'last_name' => 'hood',
'email' => 'hood@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'robin',
'last_name' => 'dale',
'email' => 'robin@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'little',
'last_name' => 'dale',
'email' => 'dale@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'little',
'last_name' => 'dale',
'email' => 'dale@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'will',
'last_name' => 'dale',
'email' => 'dale@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'will',
'last_name' => 'dale',
'email' => 'will@example.com',
'contact_type' => 'Individual',
- ),
- array(
+ ],
+ [
'first_name' => 'will',
'last_name' => 'dale',
'email' => 'will@example.com',
'contact_type' => 'Individual',
- ),
- );
+ ],
+ ];
$count = 1;
foreach ($params as $param) {
$contact = civicrm_api('contact', 'create', $param);
$this->_contactIds[$count++] = $contact['id'];
- $grpParams = array(
+ $grpParams = [
'contact_id' => $contact['id'],
- 'group_id' => $this->_groupId,
- 'version' => 3,
- );
+ 'group_id' => $this->_groupId,
+ 'version' => 3,
+ ];
$this->callAPISuccess('group_contact', 'create', $grpParams);
}
}
@$object->run();
// Retrieve pairs from prev next cache table
- $select = array('pn.is_selected' => 'is_selected');
+ $select = ['pn.is_selected' => 'is_selected'];
$cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($dao->id, $this->_groupId);
$pnDupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, NULL, NULL, 0, 0, $select);
@$object->run();
// Retrieve pairs from prev next cache table
- $select = array('pn.is_selected' => 'is_selected');
+ $select = ['pn.is_selected' => 'is_selected'];
$cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($dao->id, $this->_groupId);
$pnDupePairs = CRM_Core_BAO_PrevNextCache::retrieve($cacheKeyString, NULL, NULL, 0, 0, $select);
* @return array
*/
public function getHackedInCIDRef() {
- return array(
- 'civicrm_entity_tag' => array(
+ return [
+ 'civicrm_entity_tag' => [
0 => 'entity_id',
- ),
- );
+ ],
+ ];
}
/**
* Test function that gets duplicate pairs.
*
- * It turns out there are 2 code paths retrieving this data so my initial focus is on ensuring
- * they match.
+ * It turns out there are 2 code paths retrieving this data so my initial
+ * focus is on ensuring they match.
*/
public function testGetMatches() {
$this->setupMatchData();
FALSE
);
- $this->assertEquals(array(
- 0 => array(
+ $this->assertEquals([
+ 0 => [
'srcID' => $this->contacts[1]['id'],
'srcName' => 'Mr. Mickey Mouse II',
'dstID' => $this->contacts[0]['id'],
'dstName' => 'Mr. Mickey Mouse II',
'weight' => 20,
'canMerge' => TRUE,
- ),
- 1 => array(
+ ],
+ 1 => [
'srcID' => $this->contacts[3]['id'],
'srcName' => 'Mr. Minnie Mouse II',
'dstID' => $this->contacts[2]['id'],
'dstName' => 'Mr. Minnie Mouse II',
'weight' => 20,
'canMerge' => TRUE,
- ),
- ), $pairs);
+ ],
+ ], $pairs);
}
/**
* Test function that gets organization pairs.
*
- * Note the rule will match on organization_name OR email - hence lots of matches.
+ * Note the rule will match on organization_name OR email - hence lots of
+ * matches.
+ *
+ * @throws \Exception
*/
public function testGetOrganizationMatches() {
$this->setupMatchData();
- $ruleGroups = $this->callAPISuccessGetSingle('RuleGroup', array('contact_type' => 'Organization', 'used' => 'Supervised'));
+ $ruleGroups = $this->callAPISuccessGetSingle('RuleGroup', [
+ 'contact_type' => 'Organization',
+ 'used' => 'Supervised',
+ ]);
$pairs = CRM_Dedupe_Merger::getDuplicatePairs(
$ruleGroups['id'],
FALSE
);
- $expectedPairs = array(
- 0 => array(
+ $expectedPairs = [
+ 0 => [
'srcID' => $this->contacts[5]['id'],
'srcName' => 'Walt Disney Ltd',
'dstID' => $this->contacts[4]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 20,
'canMerge' => TRUE,
- ),
- 1 => array(
+ ],
+ 1 => [
'srcID' => $this->contacts[7]['id'],
'srcName' => 'Walt Disney',
'dstID' => $this->contacts[6]['id'],
'dstName' => 'Walt Disney',
'weight' => 10,
'canMerge' => TRUE,
- ),
- 2 => array(
+ ],
+ 2 => [
'srcID' => $this->contacts[6]['id'],
'srcName' => 'Walt Disney',
'dstID' => $this->contacts[4]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 10,
'canMerge' => TRUE,
- ),
- 3 => array(
+ ],
+ 3 => [
'srcID' => $this->contacts[6]['id'],
'srcName' => 'Walt Disney',
'dstID' => $this->contacts[5]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 10,
'canMerge' => TRUE,
- ),
- );
- usort($pairs, array(__CLASS__, 'compareDupes'));
- usort($expectedPairs, array(__CLASS__, 'compareDupes'));
+ ],
+ ];
+ usort($pairs, [__CLASS__, 'compareDupes']);
+ usort($expectedPairs, [__CLASS__, 'compareDupes']);
$this->assertEquals($expectedPairs, $pairs);
}
*
* @param array $a
* @param array $b
+ *
* @return int
*/
public static function compareDupes($a, $b) {
- foreach (array('srcName', 'dstName', 'srcID', 'dstID') as $field) {
+ foreach (['srcName', 'dstName', 'srcID', 'dstID'] as $field) {
if ($a[$field] != $b[$field]) {
return ($a[$field] < $b[$field]) ? 1 : -1;
}
/**
* Test function that gets organization duplicate pairs.
+ *
+ * @throws \Exception
*/
public function testGetOrganizationMatchesInGroup() {
$this->setupMatchData();
- $ruleGroups = $this->callAPISuccessGetSingle('RuleGroup', array('contact_type' => 'Organization', 'used' => 'Supervised'));
+ $ruleGroups = $this->callAPISuccessGetSingle('RuleGroup', [
+ 'contact_type' => 'Organization',
+ 'used' => 'Supervised',
+ ]);
- $groupID = $this->groupCreate(array('title' => 'she-mice'));
+ $groupID = $this->groupCreate(['title' => 'she-mice']);
- $this->callAPISuccess('GroupContact', 'create', array('group_id' => $groupID, 'contact_id' => $this->contacts[4]['id']));
+ $this->callAPISuccess('GroupContact', 'create', [
+ 'group_id' => $groupID,
+ 'contact_id' => $this->contacts[4]['id'],
+ ]);
$pairs = CRM_Dedupe_Merger::getDuplicatePairs(
$ruleGroups['id'],
FALSE
);
- $this->assertEquals(array(
- 0 => array(
+ $this->assertEquals([
+ 0 => [
'srcID' => $this->contacts[5]['id'],
'srcName' => 'Walt Disney Ltd',
'dstID' => $this->contacts[4]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 20,
'canMerge' => TRUE,
- ),
- 1 => array(
+ ],
+ 1 => [
'srcID' => $this->contacts[6]['id'],
'srcName' => 'Walt Disney',
'dstID' => $this->contacts[4]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 10,
'canMerge' => TRUE,
- ),
- ), $pairs);
+ ],
+ ], $pairs);
- $this->callAPISuccess('GroupContact', 'create', array('group_id' => $groupID, 'contact_id' => $this->contacts[5]['id']));
+ $this->callAPISuccess('GroupContact', 'create', [
+ 'group_id' => $groupID,
+ 'contact_id' => $this->contacts[5]['id'],
+ ]);
CRM_Core_DAO::executeQuery("DELETE FROM civicrm_prevnext_cache");
$pairs = CRM_Dedupe_Merger::getDuplicatePairs(
$ruleGroups['id'],
FALSE
);
- $this->assertEquals(array(
- 0 => array(
+ $this->assertEquals([
+ 0 => [
'srcID' => $this->contacts[5]['id'],
'srcName' => 'Walt Disney Ltd',
'dstID' => $this->contacts[4]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 20,
'canMerge' => TRUE,
- ),
- 1 => array(
+ ],
+ 1 => [
'srcID' => $this->contacts[6]['id'],
'srcName' => 'Walt Disney',
'dstID' => $this->contacts[4]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 10,
'canMerge' => TRUE,
- ),
- 2 => array(
+ ],
+ 2 => [
'srcID' => $this->contacts[6]['id'],
'srcName' => 'Walt Disney',
'dstID' => $this->contacts[5]['id'],
'dstName' => 'Walt Disney Ltd',
'weight' => 10,
'canMerge' => TRUE,
- ),
- ), $pairs);
+ ],
+ ], $pairs);
}
/**
* Test function that gets duplicate pairs.
*
- * It turns out there are 2 code paths retrieving this data so my initial focus is on ensuring
- * they match.
+ * It turns out there are 2 code paths retrieving this data so my initial
+ * focus is on ensuring they match.
*/
public function testGetMatchesInGroup() {
$this->setupMatchData();
- $groupID = $this->groupCreate(array('title' => 'she-mice'));
+ $groupID = $this->groupCreate(['title' => 'she-mice']);
- $this->callAPISuccess('GroupContact', 'create', array('group_id' => $groupID, 'contact_id' => $this->contacts[3]['id']));
+ $this->callAPISuccess('GroupContact', 'create', [
+ 'group_id' => $groupID,
+ 'contact_id' => $this->contacts[3]['id'],
+ ]);
$pairs = CRM_Dedupe_Merger::getDuplicatePairs(
1,
FALSE
);
- $this->assertEquals(array(
- 0 => array(
+ $this->assertEquals([
+ 0 => [
'srcID' => $this->contacts[3]['id'],
'srcName' => 'Mr. Minnie Mouse II',
'dstID' => $this->contacts[2]['id'],
'dstName' => 'Mr. Minnie Mouse II',
'weight' => 20,
'canMerge' => TRUE,
- ),
- ), $pairs);
+ ],
+ ], $pairs);
+ }
+
+ /**
+ * Test the special info handling is unchanged after cleanup.
+ *
+ * Note the handling is silly - we are testing to lock in over short term
+ * changes not to imply any contract on the function.
+ */
+ public function testGetRowsElementsAndInfoSpecialInfo() {
+ $contact1 = $this->individualCreate([
+ 'preferred_communication_method' => [],
+ 'communication_style_id' => 'Familiar',
+ 'prefix_id' => 'Mrs.',
+ 'suffix_id' => 'III',
+ ]);
+ $contact2 = $this->individualCreate([
+ 'preferred_communication_method' => [
+ 'SMS',
+ 'Fax',
+ ],
+ 'communication_style_id' => 'Formal',
+ 'gender_id' => 'Female',
+ ]);
+ $rowsElementsAndInfo = CRM_Dedupe_Merger::getRowsElementsAndInfo($contact1, $contact2);
+ $rows = $rowsElementsAndInfo['rows'];
+ $this->assertEquals([
+ 'main' => 'Mrs.',
+ 'other' => 'Mr.',
+ 'title' => 'Individual Prefix',
+ ], $rows['move_prefix_id']);
+ $this->assertEquals([
+ 'main' => 'III',
+ 'other' => 'II',
+ 'title' => 'Individual Suffix',
+ ], $rows['move_suffix_id']);
+ $this->assertEquals([
+ 'main' => '',
+ 'other' => 'Female',
+ 'title' => 'Gender',
+ ], $rows['move_gender_id']);
+ $this->assertEquals([
+ 'main' => 'Familiar',
+ 'other' => 'Formal',
+ 'title' => 'Communication Style',
+ ], $rows['move_communication_style_id']);
+ $this->assertEquals(1, $rowsElementsAndInfo['migration_info']['move_communication_style_id']);
+ $this->assertEquals([
+ 'main' => '',
+ 'other' => 'SMS, Fax',
+ 'title' => 'Preferred Communication Method',
+ ], $rows['move_preferred_communication_method']);
+ $this->assertEquals('\ 14\ 15\ 1', $rowsElementsAndInfo['migration_info']['move_preferred_communication_method']);
}
/**
//Add Membership for the duplicate contact.
$memTypeId = $this->membershipTypeCreate();
- $membership = $this->callAPISuccess('Membership', 'create', [
+ $this->callAPISuccess('Membership', 'create', [
'membership_type_id' => $memTypeId,
'contact_id' => $duplicateContactID,
]);
*/
public function testCustomDataOverwrite() {
// Create Custom Field
- $createGroup = $this->setupCustomGroupForIndividual();
+ $createGroup = $this->setupCustomGroupForIndividual();
$createField = $this->setupCustomField('Graduation', $createGroup);
$customFieldName = "custom_" . $createField['id'];
$duplicateContactID2 = $this->contacts[2]['id'];
// update the text custom field for original contact with value 'abc'
- $this->callAPISuccess('Contact', 'create', array(
+ $this->callAPISuccess('Contact', 'create', [
'id' => $originalContactID,
"{$customFieldName}" => 'abc',
- ));
+ ]);
$this->assertCustomFieldValue($originalContactID, 'abc', $customFieldName);
// update the text custom field for duplicate contact 1 with value 'def'
- $this->callAPISuccess('Contact', 'create', array(
+ $this->callAPISuccess('Contact', 'create', [
'id' => $duplicateContactID1,
"{$customFieldName}" => 'def',
- ));
+ ]);
$this->assertCustomFieldValue($duplicateContactID1, 'def', $customFieldName);
// update the text custom field for duplicate contact 2 with value 'ghi'
- $this->callAPISuccess('Contact', 'create', array(
+ $this->callAPISuccess('Contact', 'create', [
'id' => $duplicateContactID2,
"{$customFieldName}" => 'ghi',
- ));
+ ]);
$this->assertCustomFieldValue($duplicateContactID2, 'ghi', $customFieldName);
/*** USE-CASE 1: DO NOT OVERWRITE CUSTOM FIELD VALUE **/
- $this->mergeContacts($originalContactID, $duplicateContactID1, array(
+ $this->mergeContacts($originalContactID, $duplicateContactID1, [
"move_{$customFieldName}" => NULL,
- ));
+ ]);
$this->assertCustomFieldValue($originalContactID, 'abc', $customFieldName);
/*** USE-CASE 2: OVERWRITE CUSTOM FIELD VALUE **/
- $this->mergeContacts($originalContactID, $duplicateContactID2, array(
+ $this->mergeContacts($originalContactID, $duplicateContactID2, [
"move_{$customFieldName}" => 'ghi',
- ));
+ ]);
$this->assertCustomFieldValue($originalContactID, 'ghi', $customFieldName);
// cleanup created custom set
- $this->callAPISuccess('CustomField', 'delete', array('id' => $createField['id']));
- $this->callAPISuccess('CustomGroup', 'delete', array('id' => $createGroup['id']));
+ $this->callAPISuccess('CustomField', 'delete', ['id' => $createField['id']]);
+ $this->callAPISuccess('CustomGroup', 'delete', ['id' => $createGroup['id']]);
}
/**
*/
public function testMigrationOfUnselectedCustomDataOnEmptyCustomRecord() {
// Create Custom Fields
- $createGroup = $this->setupCustomGroupForIndividual();
+ $createGroup = $this->setupCustomGroupForIndividual();
$customField1 = $this->setupCustomField('TestField', $createGroup);
// Create multi-value custom field
$multiGroup = $this->CustomGroupMultipleCreateByParams();
- $multiField = $this->customFieldCreate(array(
+ $multiField = $this->customFieldCreate([
'custom_group_id' => $multiGroup['id'],
'label' => 'field_1' . $multiGroup['id'],
'in_selector' => 1,
- ));
+ ]);
// Contacts setup
$this->setupMatchData();
$duplicateContactID = $this->contacts[1]['id'];
// Update the text custom fields for duplicate contact
- $this->callAPISuccess('Contact', 'create', array(
+ $this->callAPISuccess('Contact', 'create', [
'id' => $duplicateContactID,
"custom_{$customField1['id']}" => 'abc',
"custom_{$multiField['id']}" => 'def',
- ));
+ ]);
$this->assertCustomFieldValue($duplicateContactID, 'abc', "custom_{$customField1['id']}");
$this->assertCustomFieldValue($duplicateContactID, 'def', "custom_{$multiField['id']}");
// Merge, and ensure that no value was migrated
- $this->mergeContacts($originalContactID, $duplicateContactID, array(
+ $this->mergeContacts($originalContactID, $duplicateContactID, [
"move_custom_{$customField1['id']}" => NULL,
"move_rel_table_custom_{$multiGroup['id']}" => NULL,
- ));
+ ]);
$this->assertCustomFieldValue($originalContactID, '', "custom_{$customField1['id']}");
$this->assertCustomFieldValue($originalContactID, '', "custom_{$multiField['id']}");
// cleanup created custom set
- $this->callAPISuccess('CustomField', 'delete', array('id' => $customField1['id']));
- $this->callAPISuccess('CustomGroup', 'delete', array('id' => $createGroup['id']));
- $this->callAPISuccess('CustomField', 'delete', array('id' => $multiField['id']));
- $this->callAPISuccess('CustomGroup', 'delete', array('id' => $multiGroup['id']));
+ $this->callAPISuccess('CustomField', 'delete', ['id' => $customField1['id']]);
+ $this->callAPISuccess('CustomGroup', 'delete', ['id' => $createGroup['id']]);
+ $this->callAPISuccess('CustomField', 'delete', ['id' => $multiField['id']]);
+ $this->callAPISuccess('CustomGroup', 'delete', ['id' => $multiGroup['id']]);
}
/**
*/
public function testMigrationOfSomeCustomDataOnEmptyCustomRecord() {
// Create Custom Fields
- $createGroup = $this->setupCustomGroupForIndividual();
+ $createGroup = $this->setupCustomGroupForIndividual();
$customField1 = $this->setupCustomField('Test1', $createGroup);
$customField2 = $this->setupCustomField('Test2', $createGroup);
// Create multi-value custom field
$multiGroup = $this->CustomGroupMultipleCreateByParams();
- $multiField = $this->customFieldCreate(array(
+ $multiField = $this->customFieldCreate([
'custom_group_id' => $multiGroup['id'],
'label' => 'field_1' . $multiGroup['id'],
'in_selector' => 1,
- ));
+ ]);
// Contacts setup
$this->setupMatchData();
$duplicateContactID = $this->contacts[1]['id'];
// Update the text custom fields for duplicate contact
- $this->callAPISuccess('Contact', 'create', array(
+ $this->callAPISuccess('Contact', 'create', [
'id' => $duplicateContactID,
"custom_{$customField1['id']}" => 'abc',
"custom_{$customField2['id']}" => 'def',
"custom_{$multiField['id']}" => 'ghi',
- ));
+ ]);
$this->assertCustomFieldValue($duplicateContactID, 'abc', "custom_{$customField1['id']}");
$this->assertCustomFieldValue($duplicateContactID, 'def', "custom_{$customField2['id']}");
$this->assertCustomFieldValue($duplicateContactID, 'ghi', "custom_{$multiField['id']}");
// Perform merge
- $this->mergeContacts($originalContactID, $duplicateContactID, array(
+ $this->mergeContacts($originalContactID, $duplicateContactID, [
"move_custom_{$customField1['id']}" => NULL,
"move_custom_{$customField2['id']}" => 'def',
"move_rel_table_custom_{$multiGroup['id']}" => '1',
- ));
+ ]);
$this->assertCustomFieldValue($originalContactID, '', "custom_{$customField1['id']}");
$this->assertCustomFieldValue($originalContactID, 'def', "custom_{$customField2['id']}");
$this->assertCustomFieldValue($originalContactID, 'ghi', "custom_{$multiField['id']}");
// cleanup created custom set
- $this->callAPISuccess('CustomField', 'delete', array('id' => $customField1['id']));
- $this->callAPISuccess('CustomField', 'delete', array('id' => $customField2['id']));
- $this->callAPISuccess('CustomGroup', 'delete', array('id' => $createGroup['id']));
- $this->callAPISuccess('CustomField', 'delete', array('id' => $multiField['id']));
- $this->callAPISuccess('CustomGroup', 'delete', array('id' => $multiGroup['id']));
+ $this->callAPISuccess('CustomField', 'delete', ['id' => $customField1['id']]);
+ $this->callAPISuccess('CustomField', 'delete', ['id' => $customField2['id']]);
+ $this->callAPISuccess('CustomGroup', 'delete', ['id' => $createGroup['id']]);
+ $this->callAPISuccess('CustomField', 'delete', ['id' => $multiField['id']]);
+ $this->callAPISuccess('CustomGroup', 'delete', ['id' => $multiGroup['id']]);
}
/**
* @param $params
* Array of fields to be merged from source into target contact, of the form
* ['move_<fieldName>' => <fieldValue>]
+ *
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
*/
private function mergeContacts($originalContactID, $duplicateContactID, $params) {
$rowsElementsAndInfo = CRM_Dedupe_Merger::getRowsElementsAndInfo($originalContactID, $duplicateContactID);
- $migrationData = array(
+ $migrationData = [
'main_details' => $rowsElementsAndInfo['main_details'],
'other_details' => $rowsElementsAndInfo['other_details'],
- );
+ ];
// Migrate data of duplicate contact
CRM_Dedupe_Merger::moveAllBelongings($originalContactID, $duplicateContactID, array_merge($migrationData, $params));
* @param $customFieldName
*/
private function assertCustomFieldValue($contactID, $expectedValue, $customFieldName) {
- $data = $this->callAPISuccess('Contact', 'getsingle', array(
+ $data = $this->callAPISuccess('Contact', 'getsingle', [
'id' => $contactID,
- 'return' => array($customFieldName),
- ));
+ 'return' => [$customFieldName],
+ ]);
$this->assertEquals($expectedValue, $data[$customFieldName], "Custom field value was supposed to be '{$expectedValue}', '{$data[$customFieldName]}' found.");
}
* Data for the created custom group record
*/
private function setupCustomGroupForIndividual() {
- $customGroup = $this->callAPISuccess('custom_group', 'get', array(
+ $customGroup = $this->callAPISuccess('custom_group', 'get', [
'name' => 'test_group',
- ));
+ ]);
if ($customGroup['count'] > 0) {
- $this->callAPISuccess('CustomGroup', 'delete', array('id' => $customGroup['id']));
+ $this->callAPISuccess('CustomGroup', 'delete', ['id' => $customGroup['id']]);
}
- $customGroup = $this->callAPISuccess('custom_group', 'create', array(
+ $customGroup = $this->callAPISuccess('custom_group', 'create', [
'title' => 'Test_Group',
'name' => 'test_group',
- 'extends' => array('Individual'),
+ 'extends' => ['Individual'],
'style' => 'Inline',
'is_multiple' => FALSE,
'is_active' => 1,
- ));
+ ]);
return $customGroup;
}
* Data for the created custom field record
*/
private function setupCustomField($fieldLabel, $createGroup) {
- return $this->callAPISuccess('custom_field', 'create', array(
+ return $this->callAPISuccess('custom_field', 'create', [
'label' => $fieldLabel,
'data_type' => 'Alphanumeric',
'html_type' => 'Text',
'custom_group_id' => $createGroup['id'],
- ));
+ ]);
}
/**
* Set up some contacts for our matching.
*/
public function setupMatchData() {
- $fixtures = array(
- array(
+ $fixtures = [
+ [
'first_name' => 'Mickey',
'last_name' => 'Mouse',
'email' => 'mickey@mouse.com',
- ),
- array(
+ ],
+ [
'first_name' => 'Mickey',
'last_name' => 'Mouse',
'email' => 'mickey@mouse.com',
- ),
- array(
+ ],
+ [
'first_name' => 'Minnie',
'last_name' => 'Mouse',
'email' => 'mickey@mouse.com',
- ),
- array(
+ ],
+ [
'first_name' => 'Minnie',
'last_name' => 'Mouse',
'email' => 'mickey@mouse.com',
- ),
- );
+ ],
+ ];
foreach ($fixtures as $fixture) {
$contactID = $this->individualCreate($fixture);
- $this->contacts[] = array_merge($fixture, array('id' => $contactID));
+ $this->contacts[] = array_merge($fixture, ['id' => $contactID]);
}
- $organizationFixtures = array(
- array(
+ $organizationFixtures = [
+ [
'organization_name' => 'Walt Disney Ltd',
'email' => 'walt@disney.com',
- ),
- array(
+ ],
+ [
'organization_name' => 'Walt Disney Ltd',
'email' => 'walt@disney.com',
- ),
- array(
+ ],
+ [
'organization_name' => 'Walt Disney',
'email' => 'walt@disney.com',
- ),
- array(
+ ],
+ [
'organization_name' => 'Walt Disney',
'email' => 'walter@disney.com',
- ),
- );
+ ],
+ ];
foreach ($organizationFixtures as $fixture) {
$contactID = $this->organizationCreate($fixture);
- $this->contacts[] = array_merge($fixture, array('id' => $contactID));
+ $this->contacts[] = array_merge($fixture, ['id' => $contactID]);
}
}
*
* This is a statically maintained (in this test list).
*
- * There is also a check against an automated list but having both seems to add extra stability to me. They do
- * not change often.
+ * There is also a check against an automated list but having both seems to
+ * add extra stability to me. They do not change often.
*/
public function getStaticCIDRefs() {
- return array(
- 'civicrm_acl_cache' => array(
+ return [
+ 'civicrm_acl_cache' => [
0 => 'contact_id',
- ),
- 'civicrm_acl_contact_cache' => array(
+ ],
+ 'civicrm_acl_contact_cache' => [
0 => 'contact_id',
- ),
- 'civicrm_action_log' => array(
+ ],
+ 'civicrm_action_log' => [
0 => 'contact_id',
- ),
- 'civicrm_activity_contact' => array(
+ ],
+ 'civicrm_activity_contact' => [
0 => 'contact_id',
- ),
- 'civicrm_address' => array(
+ ],
+ 'civicrm_address' => [
0 => 'contact_id',
- ),
- 'civicrm_batch' => array(
+ ],
+ 'civicrm_batch' => [
0 => 'created_id',
1 => 'modified_id',
- ),
- 'civicrm_campaign' => array(
+ ],
+ 'civicrm_campaign' => [
0 => 'created_id',
1 => 'last_modified_id',
- ),
- 'civicrm_case_contact' => array(
+ ],
+ 'civicrm_case_contact' => [
0 => 'contact_id',
- ),
- 'civicrm_contact' => array(
+ ],
+ 'civicrm_contact' => [
0 => 'primary_contact_id',
1 => 'employer_id',
- ),
- 'civicrm_contribution' => array(
+ ],
+ 'civicrm_contribution' => [
0 => 'contact_id',
- ),
- 'civicrm_contribution_page' => array(
+ ],
+ 'civicrm_contribution_page' => [
0 => 'created_id',
- ),
- 'civicrm_contribution_recur' => array(
+ ],
+ 'civicrm_contribution_recur' => [
0 => 'contact_id',
- ),
- 'civicrm_contribution_soft' => array(
+ ],
+ 'civicrm_contribution_soft' => [
0 => 'contact_id',
- ),
- 'civicrm_custom_group' => array(
+ ],
+ 'civicrm_custom_group' => [
0 => 'created_id',
- ),
- 'civicrm_dashboard_contact' => array(
+ ],
+ 'civicrm_dashboard_contact' => [
0 => 'contact_id',
- ),
- 'civicrm_dedupe_exception' => array(
+ ],
+ 'civicrm_dedupe_exception' => [
0 => 'contact_id1',
1 => 'contact_id2',
- ),
- 'civicrm_domain' => array(
+ ],
+ 'civicrm_domain' => [
0 => 'contact_id',
- ),
- 'civicrm_email' => array(
+ ],
+ 'civicrm_email' => [
0 => 'contact_id',
- ),
- 'civicrm_event' => array(
+ ],
+ 'civicrm_event' => [
0 => 'created_id',
- ),
- 'civicrm_event_carts' => array(
+ ],
+ 'civicrm_event_carts' => [
0 => 'user_id',
- ),
- 'civicrm_financial_account' => array(
+ ],
+ 'civicrm_financial_account' => [
0 => 'contact_id',
- ),
- 'civicrm_financial_item' => array(
+ ],
+ 'civicrm_financial_item' => [
0 => 'contact_id',
- ),
- 'civicrm_grant' => array(
+ ],
+ 'civicrm_grant' => [
0 => 'contact_id',
- ),
- 'civicrm_group' => array(
+ ],
+ 'civicrm_group' => [
0 => 'created_id',
1 => 'modified_id',
- ),
- 'civicrm_group_contact' => array(
+ ],
+ 'civicrm_group_contact' => [
0 => 'contact_id',
- ),
- 'civicrm_group_contact_cache' => array(
+ ],
+ 'civicrm_group_contact_cache' => [
0 => 'contact_id',
- ),
- 'civicrm_group_organization' => array(
+ ],
+ 'civicrm_group_organization' => [
0 => 'organization_id',
- ),
- 'civicrm_im' => array(
+ ],
+ 'civicrm_im' => [
0 => 'contact_id',
- ),
- 'civicrm_log' => array(
+ ],
+ 'civicrm_log' => [
0 => 'modified_id',
- ),
- 'civicrm_mailing' => array(
+ ],
+ 'civicrm_mailing' => [
0 => 'created_id',
1 => 'scheduled_id',
2 => 'approver_id',
- ),
- 'civicrm_file' => array(
+ ],
+ 'civicrm_file' => [
'created_id',
- ),
- 'civicrm_mailing_abtest' => array(
+ ],
+ 'civicrm_mailing_abtest' => [
0 => 'created_id',
- ),
- 'civicrm_mailing_event_queue' => array(
+ ],
+ 'civicrm_mailing_event_queue' => [
0 => 'contact_id',
- ),
- 'civicrm_mailing_event_subscribe' => array(
+ ],
+ 'civicrm_mailing_event_subscribe' => [
0 => 'contact_id',
- ),
- 'civicrm_mailing_recipients' => array(
+ ],
+ 'civicrm_mailing_recipients' => [
0 => 'contact_id',
- ),
- 'civicrm_membership' => array(
+ ],
+ 'civicrm_membership' => [
0 => 'contact_id',
- ),
- 'civicrm_membership_log' => array(
+ ],
+ 'civicrm_membership_log' => [
0 => 'modified_id',
- ),
- 'civicrm_membership_type' => array(
+ ],
+ 'civicrm_membership_type' => [
0 => 'member_of_contact_id',
- ),
- 'civicrm_note' => array(
+ ],
+ 'civicrm_note' => [
0 => 'contact_id',
- ),
- 'civicrm_openid' => array(
+ ],
+ 'civicrm_openid' => [
0 => 'contact_id',
- ),
- 'civicrm_participant' => array(
+ ],
+ 'civicrm_participant' => [
0 => 'contact_id',
//CRM-16761
1 => 'transferred_to_contact_id',
- ),
- 'civicrm_payment_token' => array(
+ ],
+ 'civicrm_payment_token' => [
0 => 'contact_id',
1 => 'created_id',
- ),
- 'civicrm_pcp' => array(
+ ],
+ 'civicrm_pcp' => [
0 => 'contact_id',
- ),
- 'civicrm_phone' => array(
+ ],
+ 'civicrm_phone' => [
0 => 'contact_id',
- ),
- 'civicrm_pledge' => array(
+ ],
+ 'civicrm_pledge' => [
0 => 'contact_id',
- ),
- 'civicrm_print_label' => array(
+ ],
+ 'civicrm_print_label' => [
0 => 'created_id',
- ),
- 'civicrm_relationship' => array(
+ ],
+ 'civicrm_relationship' => [
0 => 'contact_id_a',
1 => 'contact_id_b',
- ),
- 'civicrm_report_instance' => array(
+ ],
+ 'civicrm_report_instance' => [
0 => 'created_id',
1 => 'owner_id',
- ),
- 'civicrm_setting' => array(
+ ],
+ 'civicrm_setting' => [
0 => 'contact_id',
1 => 'created_id',
- ),
- 'civicrm_subscription_history' => array(
+ ],
+ 'civicrm_subscription_history' => [
0 => 'contact_id',
- ),
- 'civicrm_survey' => array(
+ ],
+ 'civicrm_survey' => [
0 => 'created_id',
1 => 'last_modified_id',
- ),
- 'civicrm_tag' => array(
+ ],
+ 'civicrm_tag' => [
0 => 'created_id',
- ),
- 'civicrm_uf_group' => array(
+ ],
+ 'civicrm_uf_group' => [
0 => 'created_id',
- ),
- 'civicrm_uf_match' => array(
+ ],
+ 'civicrm_uf_match' => [
0 => 'contact_id',
- ),
- 'civicrm_value_testgetcidref_1' => array(
+ ],
+ 'civicrm_value_testgetcidref_1' => [
0 => 'entity_id',
- ),
- 'civicrm_website' => array(
+ ],
+ 'civicrm_website' => [
0 => 'contact_id',
- ),
- );
+ ],
+ ];
}
/**
* Get a list of CIDs that is calculated off the schema.
*
- * Note this is an expensive and table locking query. Should be safe in tests though.
+ * Note this is an expensive and table locking query. Should be safe in tests
+ * though.
*/
public function getCalculatedCIDRefs() {
- $cidRefs = array();
+ $cidRefs = [];
$sql = "
SELECT
table_name,
$result = $this->addParticipantWithPayment($feeAmt, $amtPaid);
$contributionID = $result['contribution']['id'];
- //Complete the partial payment.
- $submittedValues = array(
+ $this->callAPISuccess('Payment', 'create', [
+ 'contribution_id' => $contributionID,
'total_amount' => 20,
'payment_instrument_id' => 3,
- );
- CRM_Contribute_BAO_Contribution::recordAdditionalPayment($contributionID, $submittedValues, 'owed', $result['participant']['id']);
+ 'participant_id' => $result['participant']['id'],
+ ]);
//Change selection to a lower amount.
$params['price_2'] = 50;
CRM_Price_BAO_LineItem::changeFeeSelections($params, $result['participant']['id'], 'participant', $contributionID, $result['feeBlock'], $result['lineItem']);
- //Record a refund of the remaining amount.
- $submittedValues['total_amount'] = 50;
- CRM_Contribute_BAO_Contribution::recordAdditionalPayment($contributionID, $submittedValues, 'refund', $result['participant']['id']);
+ $this->callAPISuccess('Payment', 'create', [
+ 'total_amount' => -50,
+ 'contribution_id' => $contributionID,
+ 'participant_id' => $result['participant']['id'],
+ 'payment_instrument_id' => 3,
+ ]);
$paymentInfo = CRM_Contribute_BAO_Contribution::getPaymentInfo($result['participant']['id'], 'event', TRUE);
$transaction = $paymentInfo['transaction'];
$contributionBalance = ($this->_cheapFee - $actualPaidAmount);
$this->assertEquals($contributionBalance, CRM_Contribute_BAO_Contribution::getContributionBalance($this->_contributionId));
- //Complete the refund payment.
- $submittedValues = array(
- 'total_amount' => 120,
+ $this->callAPISuccess('Payment', 'create', [
+ 'contribution_id' => $this->_contributionId,
+ 'total_amount' => -120,
'payment_instrument_id' => 3,
- );
- CRM_Contribute_BAO_Contribution::recordAdditionalPayment($this->_contributionId, $submittedValues, 'refund', $this->_participantId);
+ 'participant_id' => $this->_participantId,
+ ]);
$contributionBalance += 120;
$this->assertEquals($contributionBalance, CRM_Contribute_BAO_Contribution::getContributionBalance($this->_contributionId));
* Test for validating financial type has deferred revenue account relationship.
*/
public function testcheckFinancialTypeHasDeferred() {
- Civi::settings()->set('contribution_invoice_settings', array('deferred_revenue_enabled' => '1'));
- $params = array();
+ Civi::settings()->set('deferred_revenue_enabled', 1);
+ $params = [];
$valid = CRM_Financial_BAO_FinancialAccount::checkFinancialTypeHasDeferred($params);
$this->assertFalse($valid, "This should have been false");
$cid = $this->individualCreate();
class CRM_Group_Page_AjaxTest extends CiviUnitTestCase {
/**
* Permissioned group is used both as an active group the contact can see and as a group that allows
- * logged in user to see contacts
- * @var integer
+ * logged in user to see contacts.
+ *
+ * @var int
*/
protected $_permissionedGroup;
/**
* @param $full
*/
public function testSearch($fv, $count, $ids, $full) {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/queryDataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/queryDataset.xml');
$params = CRM_Contact_BAO_Query::convertFormValues($fv);
$obj = new CRM_Contact_BAO_Query($params);
* CRM-20412: Test accurate count for unique open details
*/
public function testOpenedMailingQuery() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/queryDataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/queryDataset.xml');
// ensure that total unique opened mail count is same while
// fetching rows and row count for mailing_id = 14
$totalOpenedMailCount = CRM_Mailing_Event_BAO_Opened::getTotalCount(14, NULL, TRUE);
* CRM-21194: Test accurate count for unique trackable URLs
*/
public function testTrackableUrlMailingQuery() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/queryDataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/queryDataset.xml');
// ensure that total unique clicked mail count is same while
// fetching rows and row count for mailing_id = 14 and
class CRM_Mailing_BAO_QueryTestDataProvider implements Iterator {
/**
- * @var integer
+ * @var int
*/
private $i = 0;
$this->assertEquals(1, $count);
}
+ public function getExampleTokensForUseWithoutMailingJob() {
+ $cases = [];
+ $cases[] = ['text/plain', 'To opt out: {action.optOutUrl}!', '@To opt out: .*civicrm/mailing/optout.*&jid=&qid=@'];
+ $cases[] = ['text/html', 'To opt out: <a href="{action.optOutUrl}">click here</a>!', '@To opt out: <a href=".*civicrm/mailing/optout.*&jid=&qid=.*">click@'];
+ return $cases;
+ }
+
/**
- * Check the behavior in the erroneous situation where someone uses
- * a mailing-related token without providing a mailing ID.
+ * When previewing a mailing, there is no active mailing job, so one cannot
+ * generate fully formed URLs which reference the job. The current behavior
+ * is to link to a placeholder URL which has blank values for key fields
+ * like `jid` and `qid`.
+ *
+ * This current behavior may be wise or unwise - either way, having ensures
+ * that changes are intentional.
+ *
+ * @dataProvider getExampleTokensForUseWithoutMailingJob
*/
- public function testTokensWithoutMailing() {
- // We only need one case to see that the mailing-object works as
- // an alternative to the mailing-id.
- $inputTemplateFormat = 'text/plain';
- $inputTemplate = 'To optout: {action.optOutUrl}!';
-
+ public function testTokensWithoutMailingJob($inputTemplateFormat, $inputTemplateText, $expectRegex) {
$mailing = CRM_Core_DAO::createTestObject('CRM_Mailing_DAO_Mailing', array(
'name' => 'Example Name',
));
$p = new \Civi\Token\TokenProcessor(Civi::service('dispatcher'), array(
'mailing' => $mailing,
));
- $p->addMessage('example', $inputTemplate, $inputTemplateFormat);
+ $p->addMessage('example', $inputTemplateText, $inputTemplateFormat);
$p->addRow()->context(array(
'contactId' => $contact->id,
));
- try {
- $p->evaluate();
- $this->fail('TokenProcessor::evaluate() should have thrown an exception');
- }
- catch (CRM_Core_Exception $e) {
- $this->assertRegExp(';Cannot use action tokens unless context defines mailingJobId and mailingActionTarget;', $e->getMessage());
- }
+ // try {
+ // $p->evaluate();
+ // $this->fail('TokenProcessor::evaluate() should have thrown an exception');
+ // }
+ // catch (CRM_Core_Exception $e) {
+ // $this->assertRegExp(';Cannot use action tokens unless context defines mailingJobId and mailingActionTarget;', $e->getMessage());
+ // }
+
+ $p->evaluate();
+
+ // FIXME: For compatibility with
+ $actual = $p->getRow(0)->render('example');
+ $this->assertRegExp($expectRegex, $actual);
}
}
protected $_individualId;
protected $_contribution;
protected $_financialTypeId = 1;
- protected $_apiversion;
protected $_entity = 'Membership';
protected $_params;
- protected $_ids = array();
protected $_paymentProcessorID;
/**
*
* @var array
*/
- protected $_processorParams = array();
+ protected $_processorParams = [];
/**
* ID of created membership.
*
* @var array
*/
- protected $paymentInstruments = array();
+ protected $paymentInstruments = [];
/**
* and redirect stdin to a temporary file.
*/
public function setUp() {
- $this->_apiversion = 3;
parent::setUp();
$this->_individualId = $this->individualCreate();
$this->_paymentProcessorID = $this->processorCreate();
- // Insert test data.
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/dataset/data.xml'
- )
- );
+
+ $this->loadXMLDataSet(dirname(__FILE__) . '/dataset/data.xml');
$membershipTypeAnnualFixed = $this->callAPISuccess('membership_type', 'create', array(
'domain_id' => 1,
'name' => "AnnualFixed",
));
$this->_membershipID = $membership['id'];
- $instruments = $this->callAPISuccess('contribution', 'getoptions', array('field' => 'payment_instrument_id'));
+ $instruments = $this->callAPISuccess('contribution', 'getoptions', ['field' => 'payment_instrument_id']);
$this->paymentInstruments = $instruments['values'];
}
public function testSubmit() {
$form = $this->getForm();
$this->createLoggedInUser();
- $params = array(
+ $params = [
'cid' => $this->_individualId,
'join_date' => date('m/d/Y', time()),
'start_date' => '',
'billing_state_province_id-5' => '1003',
'billing_postal_code-5' => '90210',
'billing_country_id-5' => '1228',
- );
+ ];
$form->_contactID = $this->_individualId;
$form->testSubmit($params);
+ $form->setRenewalMessage();
$membership = $this->callAPISuccessGetSingle('Membership', array('contact_id' => $this->_individualId));
$this->callAPISuccessGetCount('ContributionRecur', array('contact_id' => $this->_individualId), 0);
$contribution = $this->callAPISuccess('Contribution', 'get', array(
'return' => 'payment_instrument_id',
)),
), 'online');
+ $this->assertEquals([
+ [
+ 'text' => 'AnnualFixed membership for Mr. Anthony Anderson II has been renewed.',
+ 'title' => 'Complete',
+ 'type' => 'success',
+ 'options' => NULL,
+ ],
+ ], CRM_Core_Session::singleton()->getStatus());
}
/**
$this->_individualId = $this->individualCreate();
$this->_paymentProcessorID = $this->processorCreate();
- // Insert test data.
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/dataset/data.xml'
- )
- );
+
+ $this->loadXMLDataSet(dirname(__FILE__) . '/dataset/data.xml');
+
$membershipTypeAnnualFixed = $this->callAPISuccess('membership_type', 'create', array(
'domain_id' => 1,
'name' => "AnnualFixed",
class CRM_Member_Import_Parser_MembershipTest extends CiviUnitTestCase {
/**
* Membership type name used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_membershipTypeName = NULL;
/**
* Membership type id used in test function.
- * @var String
+ *
+ * @var string
*/
protected $_membershipTypeID = NULL;
/**
* Test renaming multiple fields.
+ *
+ * @throws Exception
*/
public function testRenameFields() {
$this->callAPISuccess('SavedSearch', 'create', [
$this->assertEquals('activity_date_time_relative', $savedSearch['form_values'][1][0]);
}
+ /**
+ * Test that a mis-saved variable in 'contribute settings' can be converted to a
+ * 'proper' setting.
+ */
+ public function testConvertUpgradeContributeSettings() {
+ Civi::settings()->set('contribution_invoice_settings', ['foo' => 'bar', 'deferred_revenue_enabled' => 1]);
+ $this->assertEquals(0, Civi::settings()->get('deferred_revenue_enabled'));
+ CRM_Upgrade_Incremental_Base::updateContributeSettings(NULL, 5.1);
+ $this->assertEquals(1, Civi::settings()->get('deferred_revenue_enabled'));
+ }
+
}
* and request the error in array format
*/
public function testCheckParamsWithDuplicateContact2() {
- // Insert a row in civicrm_contact creating individual contact
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/../../api/v3/dataset/contact_17.xml'
- )
- );
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/../../api/v3/dataset/email_contact_17.xml'
- )
- );
+ $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact', 'email' => 'TestContact@example.com']);
- $params = array(
+ $params = [
'first_name' => 'Test',
'last_name' => 'Contact',
'email' => 'TestContact@example.com',
'contact_type' => 'Individual',
- );
+ ];
$contact = _civicrm_api3_deprecated_contact_check_params($params, TRUE);
$this->assertEquals(1, $contact['is_error']);
- $this->assertRegexp("/matching contacts.*17/s",
+ $this->assertRegexp("/matching contacts.*1/s",
$contact['error_message']['message']
);
}
$this->assertEquals($expectedResult, CRM_Utils_File::isValidFileName($fileName));
}
+ public function pathToFileExtension() {
+ $cases = [];
+ $cases[] = ['/evil.pdf', 'pdf'];
+ $cases[] = ['/helloworld.jpg', 'jpg'];
+ $cases[] = ['/smartwatch_1736683_1280_9af3657015e8660cc234eb1601da871.jpg', 'jpg'];
+ return $cases;
+ }
+
+ /**
+ * Test returning appropriate file extension
+ * @dataProvider pathToFileExtension
+ * @param string $path
+ * @param string $expectedExtension
+ */
+ public function testPathToExtension($path, $expectedExtension) {
+ $this->assertEquals($expectedExtension, CRM_Utils_File::getExtensionFromPath($path));
+ }
+
+ public function mimeTypeToExtension() {
+ $cases = [];
+ $cases[] = ['text/plain', ['txt', 'text', 'conf', 'def', 'list', 'log', 'in']];
+ $cases[] = ['image/jpeg', ['jpeg', 'jpg', 'jpe']];
+ $cases[] = ['image/png', ['png']];
+ return $cases;
+ }
+
+ /**
+ * @dataProvider mimeTypeToExtension
+ * @param stirng $mimeType
+ * @param array $expectedExtensions
+ */
+ public function testMimeTypeToExtension($mimeType, $expectedExtensions) {
+ $this->assertEquals($expectedExtensions, CRM_Utils_File::getAcceptableExtensionsForMimeType($mimeType));
+ }
+
}
--- /dev/null
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5 |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2019 |
+ +--------------------------------------------------------------------+
+ | 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 |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Trait Custom Data trait.
+ *
+ * Trait for setting up custom data in tests.
+ */
+trait CRMTraits_Custom_CustomDataTrait {
+
+ /**
+ * Create a custom group with fields of multiple types.
+ *
+ * @param array $groupParams
+ */
+ public function createCustomGroupWithFieldsOfAllTypes($groupParams = []) {
+ $this->createCustomGroup($groupParams);
+ $this->ids['CustomField'] = $this->createCustomFieldsOfAllTypes();
+ }
+
+ /**
+ * Create a custom group.
+ *
+ * @param array $params
+ *
+ * @return int
+ */
+ public function createCustomGroup($params = []) {
+ $params = array_merge([
+ 'title' => 'Custom Group',
+ 'extends' => [$this->entity],
+ 'weight' => 5,
+ 'style' => 'Inline',
+ 'max_multiple' => 0,
+ ], $params);
+ $this->ids['CustomGroup'][$params['title']] = $this->callAPISuccess('CustomGroup', 'create', $params)['id'];
+ return $this->ids['CustomGroup'][$params['title']];
+ }
+
+ /**
+ * @return array
+ */
+ public function createCustomFieldsOfAllTypes() {
+ $customGroupID = $this->ids['CustomGroup']['Custom Group'];
+ $ids = [];
+ $params = [
+ 'custom_group_id' => $customGroupID,
+ 'label' => 'Enter text here',
+ 'html_type' => 'Text',
+ 'data_type' => 'String',
+ 'default_value' => 'xyz',
+ 'weight' => 1,
+ 'is_required' => 1,
+ ];
+
+ $customField = $this->callAPISuccess('CustomField', 'create', $params);
+ $ids['text'] = $customField['id'];
+
+ $optionValue[] = [
+ 'label' => 'Red',
+ 'value' => 'R',
+ 'weight' => 1,
+ 'is_active' => 1,
+ ];
+ $optionValue[] = [
+ 'label' => 'Yellow',
+ 'value' => 'Y',
+ 'weight' => 2,
+ 'is_active' => 1,
+ ];
+ $optionValue[] = [
+ 'label' => 'Green',
+ 'value' => 'G',
+ 'weight' => 3,
+ 'is_active' => 1,
+ ];
+
+ $params = [
+ 'label' => 'Pick Color',
+ 'html_type' => 'Select',
+ 'data_type' => 'String',
+ 'weight' => 2,
+ 'is_required' => 1,
+ 'is_searchable' => 0,
+ 'is_active' => 1,
+ 'option_values' => $optionValue,
+ 'custom_group_id' => $customGroupID,
+ ];
+
+ $customField = $this->callAPISuccess('custom_field', 'create', $params);
+ $ids['select_string'] = $customField['id'];
+
+ $params = [
+ 'custom_group_id' => $customGroupID,
+ 'name' => 'test_date',
+ 'label' => 'test_date',
+ 'html_type' => 'Select Date',
+ 'data_type' => 'Date',
+ 'default_value' => '20090711',
+ 'weight' => 3,
+ 'time_format' => 1,
+ ];
+
+ $customField = $this->callAPISuccess('custom_field', 'create', $params);
+
+ $ids['select_date'] = $customField['id'];
+ $params = [
+ 'custom_group_id' => $customGroupID,
+ 'name' => 'test_link',
+ 'label' => 'test_link',
+ 'html_type' => 'Link',
+ 'data_type' => 'Link',
+ 'default_value' => 'http://civicrm.org',
+ 'weight' => 4,
+ 'is_required' => 1,
+ 'is_searchable' => 0,
+ 'is_active' => 1,
+ ];
+
+ $customField = $this->callAPISuccess('custom_field', 'create', $params);
+
+ $ids['link'] = $customField['id'];
+ $fileField = $this->customFieldCreate([
+ 'custom_group_id' => $customGroupID,
+ 'data_type' => 'File',
+ 'html_type' => 'File',
+ 'default_value' => '',
+ ]);
+
+ $ids['file'] = $fileField['id'];
+ $ids['country'] = $this->customFieldCreate([
+ 'custom_group_id' => $customGroupID,
+ 'data_type' => 'Int',
+ 'html_type' => 'Select Country',
+ 'default_value' => '',
+ 'label' => 'Country',
+ 'option_type' => 0,
+ ])['id'];
+
+ return $ids;
+ }
+
+ /**
+ * Get the custom field name for the relevant key.
+ *
+ * e.g returns 'custom_5' where 5 is the id of the field using the key.
+ *
+ * Generally keys map to data types.
+ *
+ * @param string $key
+ *
+ * @return string
+ */
+ protected function getCustomFieldName($key) {
+ $linkField = 'custom_' . $this->ids['CustomField'][$key];
+ return $linkField;
+ }
+
+}
/**
* Database has been initialized.
*
- * @var boolean
+ * @var bool
*/
private static $dbInit = FALSE;
protected $tempDirs;
/**
- * @var boolean populateOnce allows to skip db resets in setUp
+ * @var bool populateOnce allows to skip db resets in setUp
*
* WARNING! USE WITH CAUTION - IT'LL RENDER DATA DEPENDENCIES
* BETWEEN TESTS WHEN RUN IN SUITE. SUITABLE FOR LOCAL, LIMITED
public static $populateOnce = FALSE;
/**
- * @var boolean DBResetRequired allows skipping DB reset
+ * @var bool DBResetRequired allows skipping DB reset
* in specific test case. If you still need
* to reset single test (method) of such case, call
* $this->cleanDB() in the first line of this
*/
private $tx = NULL;
+ /**
+ * Array of IDs created to support the test.
+ *
+ * e.g
+ * $this->ids = ['Contact' => ['descriptive_key' => $contactID], 'Group' => [$groupID]];
+ *
+ * @var array
+ */
+ protected $ids = [];
+
/**
* Class used for hooks during tests.
*
// disable any left-over test extensions
CRM_Core_DAO::executeQuery('DELETE FROM civicrm_extension WHERE full_name LIKE "test.%"');
+ $extensions = \CRM_Extension_System::singleton()->getManager();
+ $api4Status = $extensions->getStatus('org.civicrm.api4');
+ if ($api4Status != $extensions::STATUS_INSTALLED && $api4Status != $extensions::STATUS_UNKNOWN) {
+ $extensions->enable(['org.civicrm.api4']);
+ }
+
// reset all the caches
CRM_Utils_System::flushCache();
$this->getConnection()->getConnection()->query("SET FOREIGN_KEY_CHECKS = 0;");
- $xmlFiles = glob($fixturesDir . '/*.xml');
- foreach ($xmlFiles as $xmlFixture) {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $dataset = $this->createXMLDataSet($xmlFixture);
- $this->_tablesToTruncate = array_merge($this->_tablesToTruncate, $dataset->getTableNames());
- $op->execute($this->_dbconn, $dataset);
- }
-
$yamlFiles = glob($fixturesDir . '/*.yaml');
foreach ($yamlFiles as $yamlFixture) {
$op = new PHPUnit_Extensions_Database_Operation_Insert();
$this->getConnection()->getConnection()->query("SET FOREIGN_KEY_CHECKS = 1;");
}
+ /**
+ * Load the data that used to be handled by the discontinued dbunit class.
+ *
+ * This could do with further tidy up - the initial priority is simply to get rid of
+ * the dbunity package which is no longer supported.
+ *
+ * @param string $fileName
+ */
+ protected function loadXMLDataSet($fileName) {
+ CRM_Core_DAO::executeQuery('SET FOREIGN_KEY_CHECKS = 0');
+ $xml = json_decode(json_encode(simplexml_load_file($fileName)), TRUE);
+ foreach ($xml as $tableName => $element) {
+ if (!empty($element)) {
+ foreach ($element as $row) {
+ $keys = $values = [];
+ if (isset($row['@attributes'])) {
+ foreach ($row['@attributes'] as $key => $value) {
+ $keys[] = $key;
+ $values[] = is_numeric($value) ? $value : "'{$value}'";
+ }
+ }
+ elseif (!empty($row)) {
+ // cos we copied it & it is inconsistent....
+ foreach ($row as $key => $value) {
+ $keys[] = $key;
+ $values[] = is_numeric($value) ? $value : "'{$value}'";
+ }
+ }
+
+ if (!empty($values)) {
+ CRM_Core_DAO::executeQuery("
+ INSERT INTO $tableName (" . implode(',', $keys) . ') VALUES(' . implode(',', $values) . ')'
+ );
+ }
+ }
+ }
+ }
+ CRM_Core_DAO::executeQuery('SET FOREIGN_KEY_CHECKS = 1');
+ }
+
/**
* Create default domain contacts for the two domains added during test class.
* database population.
$params = array_merge($defaults, $params);
- //have a crack @ deleting it first in the hope this will prevent derailing our tests
- $this->callAPISuccess('custom_group', 'get', array(
- 'title' => $params['title'],
- array('api.custom_group.delete' => 1),
- ));
-
return $this->callAPISuccess('custom_group', 'create', $params);
}
* @return void
*/
public function setMockSettingsMetaData($extras) {
- Civi::service('settings_manager')->flush();
-
CRM_Utils_Hook::singleton()
->setHook('civicrm_alterSettingsMetaData', function (&$metadata, $domainId, $profile) use ($extras) {
$metadata = array_merge($metadata, $extras);
});
+ Civi::service('settings_manager')->flush();
+
$fields = $this->callAPISuccess('setting', 'getfields', array());
foreach ($extras as $key => $spec) {
$this->assertNotEmpty($spec['title']);
$dbLocale = '_en_US';
}
+ /**
+ * Setup or clean up SMS tests
+ * @param bool $teardown
+ *
+ * @throws \CiviCRM_API3_Exception
+ */
+ public function setupForSmsTests($teardown = FALSE) {
+ require_once 'CiviTest/CiviTestSMSProvider.php';
+
+ // Option value params for CiviTestSMSProvider
+ $groupID = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', 'sms_provider_name', 'id', 'name');
+ $params = array(
+ 'option_group_id' => $groupID,
+ 'label' => 'unittestSMS',
+ 'value' => 'unit.test.sms',
+ 'name' => 'CiviTestSMSProvider',
+ 'is_default' => 1,
+ 'is_active' => 1,
+ 'version' => 3,
+ );
+
+ if ($teardown) {
+ // Test completed, delete provider
+ $providerOptionValueResult = civicrm_api3('option_value', 'get', $params);
+ civicrm_api3('option_value', 'delete', array('id' => $providerOptionValueResult['id']));
+ return;
+ }
+
+ // Create an SMS provider "CiviTestSMSProvider". Civi handles "CiviTestSMSProvider" as a special case and allows it to be instantiated
+ // in CRM/Sms/Provider.php even though it is not an extension.
+ return civicrm_api3('option_value', 'create', $params);
+ }
+
}
}
/**
- * View all activities is required unless id is passed in, in which case ACLs are used.
+ * Check the error message is not a permission error.
*/
- public function testGetActivityAccessCiviCRMNotEnough() {
+ public function testGetActivityAccessCiviCRMEnough() {
$activity = $this->activityCreate();
$this->setPermissions(['access CiviCRM']);
$this->callAPIFailure('Activity', 'getsingle', [
'check_permissions' => 1,
'id' => $activity['id'],
- ]);
+ ], 'Expected one Activity but found 0');
+ $this->callAPISuccessGetCount('Activity', [
+ 'check_permissions' => 1,
+ 'id' => $activity['id'],
+ ], 0);
}
/**
$this->assertEquals($expectState, $created['state_province_id']);
}
+ public function testBuildStateProvinceOptionsWithDodgyProvinceLimit() {
+ $provinceLimit = [1228, "abcd;ef"];
+ $this->callAPISuccess('setting', 'create', [
+ 'provinceLimit' => $provinceLimit,
+ ]);
+ $result = $this->callAPIFailure('address', 'getoptions', ['field' => 'state_province_id']);
+ // confirm that we hit our error not a SQLI.
+ $this->assertEquals('Province limit or default country setting is incorrect', $result['error_message']);
+ $this->callAPISuccess('setting', 'create', [
+ 'provinceLimit' => [1228],
+ ]);
+ // Now confirm with a correct province setting it works fine
+ $this->callAPISuccess('address', 'getoptions', ['field' => 'state_province_id']);
+ }
+
+ public function testBuildCountryWithDodgyCountryLimitSetting() {
+ $countryLimit = [1228, "abcd;ef"];
+ $this->callAPISuccess('setting', 'create', [
+ 'countryLimit' => $countryLimit,
+ ]);
+ $result = $this->callAPIFailure('address', 'getoptions', ['field' => 'country_id']);
+ // confirm that we hit our error not a SQLI.
+ $this->assertEquals('Available Country setting is incorrect', $result['error_message']);
+ $this->callAPISuccess('setting', 'create', [
+ 'countryLimit' => [1228],
+ ]);
+ // Now confirm with a correct province setting it works fine
+ $this->callAPISuccess('address', 'getoptions', ['field' => 'country_id']);
+ }
+
+ public function testBuildCountyWithDodgeStateProvinceFiltering() {
+ $result = $this->callAPIFailure('Address', 'getoptions', [
+ 'field' => 'county_id',
+ 'state_province_id' => "abcd;ef",
+ ]);
+ $this->assertEquals('Can only accept Integers for state_province_id filtering', $result['error_message']);
+ $goodResult = $this->callAPISuccess('Address', 'getoptions', [
+ 'field' => 'county_id',
+ 'state_province_id' => 1004,
+ ]);
+ $this->assertEquals('San Francisco', $goodResult['values'][4]);
+ }
+
}
* @group headless
*/
class api_v3_ContactTest extends CiviUnitTestCase {
+ use CRMTraits_Custom_CustomDataTrait;
+
public $DBResetRequired = FALSE;
protected $_apiversion;
protected $_entity;
protected $_contactID;
protected $_financialTypeId = 1;
+
+ /**
+ * Entity to be extended.
+ *
+ * @var string
+ */
+ protected $entity = 'Contact';
+
/**
* Test setup for every test.
*
* Verify successful update of individual contact.
*/
public function testUpdateIndividualWithAll() {
- // Insert a row in civicrm_contact creating individual contact.
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_ind.xml'
- )
- );
+ $contactID = $this->individualCreate();
- $params = array(
- 'id' => 23,
+ $params = [
+ 'id' => $contactID,
'first_name' => 'abcd',
'contact_type' => 'Individual',
'nick_name' => 'This is nickname first',
'external_identifier' => '1928837465',
'image_URL' => 'http://some.url.com/image.jpg',
'home_url' => 'http://www.example.org',
-
- );
+ ];
$this->callAPISuccess('Contact', 'Update', $params);
$getResult = $this->callAPISuccess('Contact', 'Get', $params);
//reducing this test partially back to api v2 level to get it through
unset($params['home_url']);
foreach ($params as $key => $value) {
- $this->assertEquals($value, $getResult['values'][23][$key]);
+ $this->assertEquals($value, $getResult['values'][$contactID][$key]);
}
- // Check updated civicrm_contact against expected.
- $expected = $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_ind_upd.xml'
- );
- $actual = new PHPUnit_Extensions_Database_DataSet_QueryDataSet(
- $this->_dbconn
- );
- $actual->addTable('civicrm_contact');
- $expected->matches($actual);
}
/**
* Verify successful update of organization contact.
+ *
+ * @throws \Exception
*/
public function testUpdateOrganizationWithAll() {
- // Insert a row in civicrm_contact creating organization contact
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_org.xml'
- )
- );
+ $contactID = $this->organizationCreate();
- $params = array(
- 'id' => 24,
+ $params = [
+ 'id' => $contactID,
'organization_name' => 'WebAccess India Pvt Ltd',
'legal_name' => 'WebAccess',
'sic_code' => 'ABC12DEF',
'contact_type' => 'Organization',
- );
+ ];
$this->callAPISuccess('Contact', 'Update', $params);
-
- // Check updated civicrm_contact against expected.
- $expected = $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_org_upd.xml'
- );
- $actual = new PHPUnit_Extensions_Database_DataSet_QueryDataSet(
- $this->_dbconn
- );
- $actual->addTable('civicrm_contact');
- $expected->matches($actual);
+ $this->getAndCheck($params, $contactID, 'Contact');
}
/**
* Verify successful update of household contact.
*/
public function testUpdateHouseholdWithAll() {
- // Insert a row in civicrm_contact creating household contact
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_hld.xml'
- )
- );
+ $contactID = $this->householdCreate();
- $params = array(
- 'id' => 25,
+ $params = [
+ 'id' => $contactID ,
'household_name' => 'ABC household',
'nick_name' => 'ABC House',
'contact_type' => 'Household',
- );
+ ];
$result = $this->callAPISuccess('Contact', 'Update', $params);
- $expected = array(
+ $expected = [
'contact_type' => 'Household',
'is_opt_out' => 0,
'sort_name' => 'ABC household',
'display_name' => 'ABC household',
'nick_name' => 'ABC House',
- );
+ ];
$this->getAndCheck($expected, $result['id'], 'contact');
}
* CRM-7645.
*/
public function testUpdateCreateWithID() {
- // Insert a row in civicrm_contact creating individual contact.
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_ind.xml'
- )
- );
-
- $params = array(
- 'id' => 23,
+ $contactID = $this->individualCreate();
+ $this->callAPISuccess('Contact', 'Update', [
+ 'id' => $contactID,
'first_name' => 'abcd',
'last_name' => 'wxyz',
- );
- $this->callAPISuccess('Contact', 'Update', $params);
+ ]);
}
/**
* Test civicrm_contact_getquick() with empty name param.
*/
public function testContactGetQuick() {
- // Insert a row in civicrm_contact creating individual contact.
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_17.xml'
- )
- );
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/email_contact_17.xml'
- )
- );
- $params = array(
- 'name' => "T",
- );
+ $contactID = $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact', 'email' => 'TestContact@example.com']);
- $result = $this->callAPISuccess('contact', 'getquick', $params);
- $this->assertEquals(17, $result['values'][0]['id']);
- $params = array(
+ $result = $this->callAPISuccess('contact', 'getquick', ['name' => 'T']);
+ $this->assertEquals($contactID, $result['values'][0]['id']);
+ $params = [
'name' => "TestContact@example.com",
'field_name' => 'sort_name',
- );
+ ];
$result = $this->callAPISuccess('contact', 'getquick', $params);
- $this->assertEquals(17, $result['values'][0]['id']);
+ $this->assertEquals($contactID, $result['values'][0]['id']);
}
/**
* Test civicrm_contact_get) with empty params.
*/
public function testContactGetEmptyParams() {
- $this->callAPISuccess('contact', 'get', array());
+ $this->callAPISuccess('contact', 'get', []);
}
/**
* Test civicrm_contact_get(,true) with no matches.
*/
public function testContactGetOldParamsNoMatches() {
- // Insert a row in civicrm_contact creating contact 17.
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_17.xml'
- )
- );
-
- $params = array(
- 'first_name' => 'Fred',
- );
- $result = $this->callAPISuccess('contact', 'get', $params);
+ $this->individualCreate();
+ $result = $this->callAPISuccess('contact', 'get', ['first_name' => 'Fred']);
$this->assertEquals(0, $result['count']);
}
* Test civicrm_contact_get(,true) with one match.
*/
public function testContactGetOldParamsOneMatch() {
- // Insert a row in civicrm_contact creating contact 17
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(dirname(__FILE__) . '/dataset/contact_17.xml'
- )
- );
+ $contactID = $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact']);
- $params = array(
- 'first_name' => 'Test',
- );
- $result = $this->callAPISuccess('contact', 'get', $params);
- $this->assertEquals(17, $result['values'][17]['contact_id']);
- $this->assertEquals(17, $result['id']);
+ $result = $this->callAPISuccess('contact', 'get', ['first_name' => 'Test']);
+ $this->assertEquals($contactID, $result['values'][$contactID]['contact_id']);
+ $this->assertEquals($contactID, $result['id']);
}
/**
* Test TrueFalse format - I couldn't come up with an easy way to get an error on Get.
*/
public function testContactGetFormatIsSuccessTrue() {
- $this->createContactFromXML();
+ $contactID = $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact']);
$description = "This demonstrates use of the 'format.is_success' param.
This param causes only the success or otherwise of the function to be returned as BOOLEAN";
$subfile = "FormatIsSuccess_True";
- $params = array('id' => 17, 'format.is_success' => 1);
+ $params = ['id' => $contactID, 'format.is_success' => 1];
$result = $this->callAPIAndDocument('Contact', 'Get', $params, __FUNCTION__, __FILE__, $description, $subfile);
$this->assertEquals(1, $result);
$this->callAPISuccess('Contact', 'Delete', $params);
* Test Single Entity format.
*/
public function testContactGetSingleEntityArray() {
- $this->createContactFromXML();
+ $contactID = $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact']);
$description = "This demonstrates use of the 'format.single_entity_array' param.
This param causes the only contact to be returned as an array without the other levels.
It will be ignored if there is not exactly 1 result";
$subfile = "GetSingleContact";
- $params = array('id' => 17);
- $result = $this->callAPIAndDocument('Contact', 'GetSingle', $params, __FUNCTION__, __FILE__, $description, $subfile);
- $this->assertEquals('Test Contact', $result['display_name']);
- $this->callAPISuccess('Contact', 'Delete', $params);
+ $result = $this->callAPIAndDocument('Contact', 'GetSingle', ['id' => $contactID], __FUNCTION__, __FILE__, $description, $subfile);
+ $this->assertEquals('Mr. Test Contact II', $result['display_name']);
+ $this->callAPISuccess('Contact', 'Delete', ['id' => $contactID]);
}
/**
* Test Single Entity format.
*/
public function testContactGetFormatCountOnly() {
- $this->createContactFromXML();
+ $contactID = $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact']);
$description = "This demonstrates use of the 'getCount' action.
This param causes the count of the only function to be returned as an integer.";
- $params = array('id' => 17);
+ $params = ['id' => $contactID];
$result = $this->callAPIAndDocument('Contact', 'GetCount', $params, __FUNCTION__, __FILE__, $description,
'GetCountContact');
$this->assertEquals('1', $result);
* Test id only format.
*/
public function testContactGetFormatIDOnly() {
- $this->createContactFromXML();
+ $contactID = $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact']);
$description = "This demonstrates use of the 'format.id_only' param.
This param causes the id of the only entity to be returned as an integer.
It will be ignored if there is not exactly 1 result";
$subfile = "FormatOnlyID";
- $params = array('id' => 17, 'format.only_id' => 1);
+ $params = ['id' => $contactID, 'format.only_id' => 1];
$result = $this->callAPIAndDocument('Contact', 'Get', $params, __FUNCTION__, __FILE__, $description, $subfile);
- $this->assertEquals('17', $result);
+ $this->assertEquals($contactID, $result);
$this->callAPISuccess('Contact', 'Delete', $params);
}
* Test id only format.
*/
public function testContactGetFormatSingleValue() {
- $this->createContactFromXML();
+ $contactID = $this->individualCreate(['first_name' => 'Test', 'last_name' => 'Contact']);
$description = "This demonstrates use of the 'format.single_value' param.
This param causes only a single value of the only entity to be returned as an string.
It will be ignored if there is not exactly 1 result";
$subFile = "FormatSingleValue";
- $params = array('id' => 17, 'return' => 'display_name');
+ $params = ['id' => $contactID, 'return' => 'display_name'];
$result = $this->callAPIAndDocument('Contact', 'getvalue', $params, __FUNCTION__, __FILE__, $description, $subFile);
- $this->assertEquals('Test Contact', $result);
+ $this->assertEquals('Mr. Test Contact II', $result);
$this->callAPISuccess('Contact', 'Delete', $params);
}
$this->callAPISuccess('contact', 'update', $params);
}
- /**
- * Set up helper to create a contact.
- */
- public function createContactFromXML() {
- // Insert a row in civicrm_contact creating contact 17.
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/contact_17.xml'
- )
- );
- }
-
/**
* Test contact proximity api.
*/
}
+ /**
+ * Test merging 2 contacts with custom fields.
+ *
+ * @throws \Exception
+ */
+ public function testMergeCustomFields() {
+ $contact1 = $this->individualCreate();
+ /* Not sure this is quite right but it does get it into the file table
+ $file = $this->callAPISuccess('Attachment', 'create', [
+ 'name' => 'header.txt',
+ 'mime_type' => 'text/plain',
+ 'description' => 'My test description',
+ 'content' => 'My test content',
+ 'entity_table' => 'civicrm_contact',
+ 'entity_id' => $contact1,
+ ]);
+ */
+
+ $this->createCustomGroupWithFieldsOfAllTypes();
+ $fileField = $this->getCustomFieldName('file');
+ $linkField = $this->getCustomFieldName('link');
+ $dateField = $this->getCustomFieldName('select_date');
+ $selectField = $this->getCustomFieldName('select_string');
+ $countryField = $this->getCustomFieldName('country');
+
+ $countriesByName = array_flip(CRM_Core_PseudoConstant::country(FALSE, FALSE));
+ $customFieldValues = [
+ // @todo fix the fatal bug on this & uncomment - see dev/core#723
+ // $fileField => $file['id'],
+ $linkField => 'http://example.org',
+ $dateField => '2018-01-01 17:10:56',
+ $selectField => 'G',
+ // Currently broken.
+ //$countryField => $countriesByName['New Zealand'],
+ ];
+ $this->callAPISuccess('Contact', 'create', array_merge([
+ 'id' => $contact1,
+ ], $customFieldValues));
+
+ $contact2 = $this->individualCreate();
+ $this->callAPISuccess('contact', 'merge', [
+ 'to_keep_id' => $contact2,
+ 'to_remove_id' => $contact1,
+ 'auto_flip' => FALSE,
+ ]);
+ $contact = $this->callAPISuccessGetSingle('Contact', ['id' => $contact2, 'return' => array_keys($customFieldValues)]);
+ foreach ($customFieldValues as $key => $value) {
+ $this->assertEquals($value, $contact[$key]);
+ }
+ }
+
/**
* Test retrieving merged contacts.
*
*/
class api_v3_CustomValueTest extends CiviUnitTestCase {
protected $_apiversion = 3;
- protected $ids;
+
protected $optionGroup;
public $DBResetRequired = FALSE;
$this->addFinancialAclPermissions([['view', 'Donation']]);
$this->callAPISuccessGetSingle('contribution', $params);
$this->callAPISuccessGetCount('contribution', ['financial_type_id' => 'Member Dues', 'check_permissions' => 1], 0);
- $this->markTestIncomplete('check_permissions = 0 should be respected but is not - I have added a todo at the right place but not changed it as yet');
$this->callAPISuccessGetCount('contribution', ['financial_type_id' => 'Member Dues'], 1);
}
* @group headless
*/
class api_v3_GroupNestingTest extends CiviUnitTestCase {
- protected $_apiversion;
/**
* Sets up the fixture, for example, opens a network connection.
+ *
* This method is called before a test is executed.
*/
protected function setUp() {
- $this->_apiversion = 3;
parent::setUp();
- // Insert a row in civicrm_group creating option group
- // from_email_address group
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/group_admins.xml'
- )
- );
-
- // Insert a row in civicrm_group creating option group
- // from_email_address group
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/group_subscribers.xml'
- )
- );
+ $this->ids['Group'] = [];
+ $this->ids['Group']['parent'] = $this->callAPISuccess('Group', 'create', [
+ 'name' => 'Administrators',
+ 'title' => 'Administrators',
+ ])['id'];
+ $this->ids['Group']['child'] = $this->callAPISuccess('Group', 'create', [
+ 'name' => 'Newsletter Subscribers',
+ 'title' => 'Newsletter Subscribers',
+ 'parents' => $this->ids['Group']['parent'],
+ ])['id'];
+ $this->ids['Group']['child2'] = $this->callAPISuccess('Group', 'create', [
+ 'name' => 'Another Newsletter Subscribers',
+ 'title' => 'Another Newsletter Subscribers',
+ 'parents' => $this->ids['Group']['parent'],
+ ])['id'];
+ $this->ids['Group']['child3'] = $this->callAPISuccess('Group', 'create', [
+ 'name' => 'Super Special Newsletter Subscribers',
+ 'title' => 'Super Special Newsletter Subscribers',
+ 'parents' => [$this->ids['Group']['parent'], $this->ids['Group']['child']],
+ ])['id'];
- // Insert a row in civicrm_group creating option group
- // from_email_address group
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/group_nesting.xml'
- )
- );
}
/**
- * Tears down the fixture, for example, closes a network connection.
+ * Tears down the fixture.
+ *
* This method is called after a test is executed.
+ *
+ * @throws \Exception
*/
protected function tearDown() {
- // Truncate the tables
$this->quickCleanup(
- array(
+ [
'civicrm_group',
'civicrm_group_nesting',
'civicrm_contact',
'civicrm_uf_group',
'civicrm_uf_join',
'civicrm_uf_match',
- )
+ ]
);
}
- ///////////////// civicrm_group_nesting_get methods
-
/**
* Test civicrm_group_nesting_get.
*/
public function testGet() {
- $params = array(
- 'parent_group_id' => 1,
- 'child_group_id' => 2,
- );
+ $params = [
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ 'child_group_id' => $this->ids['Group']['child'],
+ ];
$result = $this->callAPIAndDocument('group_nesting', 'get', $params, __FUNCTION__, __FILE__);
- // expected data loaded in setUp
- $expected = array(
- 1 => array(
+ $expected = [
+ 1 => [
'id' => 1,
- 'child_group_id' => 2,
- 'parent_group_id' => 1,
- ),
- );
+ 'child_group_id' => $this->ids['Group']['child'],
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ ],
+ ];
$this->assertEquals($expected, $result['values']);
}
/**
- * Test civicrm_group_nesting_get with just one
- * param (child_group_id).
+ * Test civicrm_group_nesting_get with just one param (child_group_id).
*/
public function testGetWithChildGroupId() {
- $params = array(
- 'child_group_id' => 4,
- );
+ $params = [
+ 'child_group_id' => $this->ids['Group']['child3'],
+ ];
$result = $this->callAPISuccess('group_nesting', 'get', $params);
// expected data loaded in setUp
- $expected = array(
- 3 => array(
+ $expected = [
+ 3 => [
'id' => 3,
- 'child_group_id' => 4,
- 'parent_group_id' => 1,
- ),
- 4 => array(
+ 'child_group_id' => $this->ids['Group']['child3'],
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ ],
+ 4 => [
'id' => 4,
- 'child_group_id' => 4,
- 'parent_group_id' => 2,
- ),
- );
+ 'child_group_id' => $this->ids['Group']['child3'],
+ 'parent_group_id' => $this->ids['Group']['child'],
+ ],
+ ];
$this->assertEquals($expected, $result['values']);
}
/**
- * Test civicrm_group_nesting_get with just one
- * param (parent_group_id).
+ * Test civicrm_group_nesting_get with just one param (parent_group_id).
*/
public function testGetWithParentGroupId() {
- $params = array(
- 'parent_group_id' => 1,
- );
+ $params = [
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ ];
$result = $this->callAPISuccess('group_nesting', 'get', $params);
// expected data loaded in setUp
- $expected = array(
- 1 => array(
+ $expected = [
+ 1 => [
'id' => 1,
- 'child_group_id' => 2,
- 'parent_group_id' => 1,
- ),
- 2 => array(
+ 'child_group_id' => $this->ids['Group']['child'],
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ ],
+ 2 => [
'id' => 2,
- 'child_group_id' => 3,
- 'parent_group_id' => 1,
- ),
- 3 => array(
+ 'child_group_id' => $this->ids['Group']['child2'],
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ ],
+ 3 => [
'id' => 3,
- 'child_group_id' => 4,
- 'parent_group_id' => 1,
- ),
- );
+ 'child_group_id' => $this->ids['Group']['child3'],
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ ],
+ ];
$this->assertEquals($expected, $result['values']);
}
/**
* Test civicrm_group_nesting_get for no records results.
+ *
* Success expected. (these tests are of marginal value as are in syntax conformance,
* don't copy & paste
*/
public function testGetEmptyResults() {
- $params = array(
- 'parent_group_id' => 1,
+ $params = [
+ 'parent_group_id' => $this->ids['Group']['parent'],
'child_group_id' => 700,
- );
+ ];
$this->callAPISuccess('group_nesting', 'get', $params);
}
- ///////////////// civicrm_group_nesting_create methods
-
/**
* Test civicrm_group_nesting_create.
+ *
+ * @throws \Exception
*/
public function testCreate() {
- // groups id=1 and id=2 loaded in setUp
- $params = array(
- 'parent_group_id' => 1,
- 'child_group_id' => 3,
- );
+ $params = [
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ 'child_group_id' => $this->ids['Group']['child2'],
+ ];
$this->callAPIAndDocument('group_nesting', 'create', $params, __FUNCTION__, __FILE__);
$this->callAPISuccessGetCount('GroupNesting', $params, 1);
* Test civicrm_group_nesting_remove.
*/
public function testDelete() {
- // groups id=1 and id=2 loaded in setUp
- $getparams = array(
- 'parent_group_id' => 1,
- 'child_group_id' => 2,
- );
+ $params = [
+ 'parent_group_id' => $this->ids['Group']['parent'],
+ 'child_group_id' => $this->ids['Group']['child'],
+ ];
- $result = $this->callAPISuccess('group_nesting', 'get', $getparams);
- $params = array('id' => $result['id']);
+ $result = $this->callAPISuccess('group_nesting', 'get', $params);
+ $params = ['id' => $result['id']];
$this->callAPIAndDocument('group_nesting', 'delete', $params, __FUNCTION__, __FILE__);
- $this->assertEquals(0, $this->callAPISuccess('group_nesting', 'getcount', $getparams));
+ $this->assertEquals(0, $this->callAPISuccess('group_nesting', 'getcount', $params));
}
/**
* Error expected.
*/
public function testDeleteWithEmptyParams() {
- $this->callAPIFailure('group_nesting', 'delete', array());
+ $this->callAPIFailure('group_nesting', 'delete', []);
}
}
* We create 3 contacts - 1 is in our group, 1 has our membership & the chosen one has both
* & check that only the chosen one got the reminder
*/
- public function testCallSendReminderLimitTo() {
+ public function testCallSendReminderLimitToSMS() {
$membershipTypeID = $this->membershipTypeCreate();
$this->membershipStatusCreate();
$createTotal = 3;
$groupID = $this->groupCreate(array('name' => 'Texan drawlers', 'title' => 'a...'));
for ($i = 1; $i <= $createTotal; $i++) {
$contactID = $this->individualCreate();
+ $this->callAPISuccess('Phone', 'create', [
+ 'contact_id' => $contactID,
+ 'phone' => '555 123 1234',
+ 'phone_type_id' => 'Mobile',
+ 'location_type_id' => 'Billing',
+ ]);
if ($i == 2) {
$theChosenOneID = $contactID;
}
));
}
}
+ $this->setupForSmsTests();
+ $provider = civicrm_api3('SmsProvider', 'create', array(
+ 'name' => "CiviTestSMSProvider",
+ 'api_type' => "1",
+ "username" => "1",
+ "password" => "1",
+ "api_type" => "1",
+ "api_url" => "1",
+ "api_params" => "a=1",
+ "is_default" => "1",
+ "is_active" => "1",
+ "domain_id" => "1",
+ ));
$this->callAPISuccess('action_schedule', 'create', array(
'title' => " remind all Texans",
'subject' => "drawling renewal",
'start_action_unit' => 'day',
'group_id' => $groupID,
'limit_to' => TRUE,
+ 'sms_provider_id' => $provider['id'],
+ 'mode' => 'User_Preference',
));
$this->callAPISuccess('job', 'send_reminder', array());
$successfulCronCount = CRM_Core_DAO::singleValueQuery("SELECT count(*) FROM civicrm_action_log");
$this->assertEquals($successfulCronCount, 1);
$sentToID = CRM_Core_DAO::singleValueQuery("SELECT contact_id FROM civicrm_action_log");
$this->assertEquals($sentToID, $theChosenOneID);
+ $this->assertEquals(0, CRM_Core_DAO::singleValueQuery("SELECT is_error FROM civicrm_action_log"));
+ $this->setupForSmsTests(TRUE);
}
public function testCallDisableExpiredRelationships() {
$this->contactDelete($orgID);
}
+ /**
+ * Test scheduled reminders respect limit to (since above identified addition_to handling issue).
+ *
+ * We create 3 contacts - 1 is in our group, 1 has our membership & the chosen one has both
+ * & check that only the chosen one got the reminder
+ *
+ * Also check no hard fail on cron job with running a reminder that has a deleted SMS provider
+ */
+ public function testCallSendReminderLimitToSMSWithDeletedProviderr() {
+ $membershipTypeID = $this->membershipTypeCreate();
+ $this->membershipStatusCreate();
+ $createTotal = 3;
+ $groupID = $this->groupCreate(array('name' => 'Texan drawlers', 'title' => 'a...'));
+ for ($i = 1; $i <= $createTotal; $i++) {
+ $contactID = $this->individualCreate();
+ $this->callAPISuccess('Phone', 'create', [
+ 'contact_id' => $contactID,
+ 'phone' => '555 123 1234',
+ 'phone_type_id' => 'Mobile',
+ 'location_type_id' => 'Billing',
+ ]);
+ if ($i == 2) {
+ $theChosenOneID = $contactID;
+ }
+ if ($i < 3) {
+ $this->callAPISuccess('group_contact', 'create', array(
+ 'contact_id' => $contactID,
+ 'status' => 'Added',
+ 'group_id' => $groupID,
+ ));
+ }
+ if ($i > 1) {
+ $this->callAPISuccess('membership', 'create', array(
+ 'contact_id' => $contactID,
+ 'membership_type_id' => $membershipTypeID,
+ 'join_date' => 'now',
+ 'start_date' => '+ 1 day',
+ ));
+ }
+ }
+ $this->setupForSmsTests();
+ $provider = civicrm_api3('SmsProvider', 'create', array(
+ 'name' => "CiviTestSMSProvider",
+ 'api_type' => "1",
+ "username" => "1",
+ "password" => "1",
+ "api_type" => "1",
+ "api_url" => "1",
+ "api_params" => "a=1",
+ "is_default" => "1",
+ "is_active" => "1",
+ "domain_id" => "1",
+ ));
+ $this->callAPISuccess('action_schedule', 'create', array(
+ 'title' => " remind all Texans",
+ 'subject' => "drawling renewal",
+ 'entity_value' => $membershipTypeID,
+ 'mapping_id' => 4,
+ 'start_action_date' => 'membership_start_date',
+ 'start_action_offset' => 1,
+ 'start_action_condition' => 'before',
+ 'start_action_unit' => 'day',
+ 'group_id' => $groupID,
+ 'limit_to' => TRUE,
+ 'sms_provider_id' => $provider['id'],
+ 'mode' => 'SMS',
+ ));
+ $this->callAPISuccess('SmsProvider', 'delete', ['id' => $provider['id']]);
+ $this->callAPISuccess('job', 'send_reminder', array());
+ $cronCount = CRM_Core_DAO::singleValueQuery("SELECT count(*) FROM civicrm_action_log");
+ $this->assertEquals($cronCount, 1);
+ $sentToID = CRM_Core_DAO::singleValueQuery("SELECT contact_id FROM civicrm_action_log");
+ $this->assertEquals($sentToID, $theChosenOneID);
+ $cronlog = CRM_Core_DAO::executeQuery("SELECT * FROM civicrm_action_log")->fetchAll()[0];
+ $this->assertEquals(1, $cronlog['is_error']);
+ $this->assertEquals('SMS reminder cannot be sent because the SMS provider has been deleted.', $cronlog['message']);
+ $this->setupForSmsTests(TRUE);
+ }
+
/**
* Test the batch merge function.
*
$this->assertEquals(array_search('Expired', $memStatus), $membership['status_id']);
}
+ /**
+ * Test procesing membership where is_override is set to 0 rather than NULL
+ */
+ public function testProcessMembershipIsOverrideNotNullNot1either() {
+ $membershipTypeId = $this->membershipTypeCreate();
+
+ // Create admin-only membership status and get all statuses.
+ $result = $this->callAPISuccess('membership_status', 'create', ['name' => 'Admin', 'is_admin' => 1, 'sequential' => 1]);
+ $membershipStatusIdAdmin = $result['values'][0]['id'];
+ $memStatus = CRM_Member_PseudoConstant::membershipStatus();
+
+ // Default params, which we'll expand on below.
+ $params = [
+ 'membership_type_id' => $membershipTypeId,
+ // Don't calculate status.
+ 'skipStatusCal' => 1,
+ 'source' => 'Test',
+ 'sequential' => 1,
+ ];
+
+ // Create membership with incorrect status but dates implying status Current.
+ $params['contact_id'] = $this->individualCreate();
+ $params['join_date'] = date('Y-m-d', strtotime('now - 6 month'));
+ $params['start_date'] = date('Y-m-d', strtotime('now - 6 month'));
+ $params['end_date'] = date('Y-m-d', strtotime('now + 6 month'));
+ // Intentionally incorrect status.
+ $params['status_id'] = 'New';
+ $resultCurrent = $this->callAPISuccess('Membership', 'create', $params);
+ // Ensure that is_override is set to 0 by doing through DB given API not seem to accept id
+ CRM_Core_DAO::executeQuery("Update civicrm_membership SET is_override = 0 WHERE id = %1", [1 => [$resultCurrent['id'], 'Positive']]);
+ $this->assertEquals(array_search('New', $memStatus), $resultCurrent['values'][0]['status_id']);
+ $jobResult = $this->callAPISuccess('Job', 'process_membership', []);
+ $this->assertEquals('Processed 1 membership records. Updated 1 records.', $jobResult['values']);
+ $this->assertEquals(array_search('Current', $memStatus), $this->callAPISuccess('Membership', 'get', ['id' => $resultCurrent['id']])['values'][$resultCurrent['id']]['status_id']);
+ }
+
}
parent::setUp();
$this->useTransaction(TRUE);
$this->createLoggedInUser();
- $this->_mailingID_A = $this->createMailing();
- $this->_mailingID_B = $this->createMailing();
- $this->_mailingID_C = $this->createMailing();
+ $this->_mailingID_A = $this->createMailing([
+ 'subject' => 'subject a ' . time(),
+ 'body_text' => 'body_text a ' . time(),
+ ]);
+ $this->_mailingID_B = $this->createMailing([
+ 'subject' => 'subject b ' . time(),
+ 'body_text' => 'body_text b ' . time(),
+ ]);
+ $this->_mailingID_C = $this->createMailing([
+ 'subject' => 'not yet ' . time(),
+ 'body_text' => 'not yet ' . time(),
+ ]);
$this->_groupID = $this->groupCreate();
$this->_params = array(
$this->assertJobCounts(1, 1, 1);
}
+ /**
+ * Create a test. Declare the second mailing a winner. Ensure that key
+ * fields propagate to the final mailing.
+ */
+ public function testSubmitWinnderId() {
+ $checkSyncFields = ['subject', 'body_text'];
+
+ $result = $this->groupContactCreate($this->_groupID, 20, TRUE);
+ $this->assertEquals(20, $result['added'], "in line " . __LINE__);
+
+ $params = $this->_params;
+ $params['group_percentage'] = 10;
+ $result = $this->callAPISuccess($this->_entity, 'create', $params);
+
+ $this->callAPISuccess('Mailing', 'create', [
+ 'id' => $this->_mailingID_A,
+ 'groups' => ['include' => [$this->_groupID]],
+ ]);
+ $this->assertJobCounts(0, 0, 0);
+
+ $this->callAPISuccess('MailingAB', 'submit', [
+ 'id' => $result['id'],
+ 'status' => 'Testing',
+ 'scheduled_date' => 'now',
+ 'approval_date' => 'now',
+ ]);
+ $this->assertJobCounts(1, 1, 0);
+
+ $b = $this->getApiValues('Mailing', ['id' => $this->_mailingID_B], $checkSyncFields);
+ $c = $this->getApiValues('Mailing', ['id' => $this->_mailingID_C], $checkSyncFields);
+ $this->assertNotEquals($b, $c);
+
+ $this->callAPISuccess('MailingAB', 'submit', [
+ 'id' => $result['id'],
+ 'status' => 'Final',
+ 'winner_id' => $this->_mailingID_B,
+ 'scheduled_date' => 'now',
+ 'approval_date' => 'now',
+ ]);
+ $this->assertJobCounts(1, 1, 1);
+
+ $b = $this->getApiValues('Mailing', ['id' => $this->_mailingID_B], $checkSyncFields);
+ $c = $this->getApiValues('Mailing', ['id' => $this->_mailingID_C], $checkSyncFields);
+ $this->assertEquals($b, $c);
+ }
+
+ /**
+ * Lookup a record via API. Return *only* the expected values.
+ *
+ * @param $entity
+ * @param $filter
+ * @param $return
+ * @return array
+ */
+ protected function getApiValues($entity, $filter, $return) {
+ $rec = $this->callAPISuccess($entity, 'getsingle', $filter + ['return' => $return]);
+ return CRM_Utils_Array::subset($rec, $return);
+ }
+
/**
* @param $expectedCountA
* @param $expectedCountB
* @group headless
*/
class api_v3_MailingContactTest extends CiviUnitTestCase {
- protected $_apiversion = 3;
protected $_entity = 'mailing';
public function setUp() {
parent::setUp();
- $params = array(
+ $params = [
'first_name' => 'abc1',
'contact_type' => 'Individual',
'last_name' => 'xyz1',
- );
+ ];
$this->_contact = $this->callAPISuccess("contact", "create", $params);
}
public function tearDown() {
- $this->callAPISuccess("contact", "delete", array('id' => $this->_contact['id']));
+ $this->callAPISuccess("contact", "delete", ['id' => $this->_contact['id']]);
parent::tearDown();
}
* belongs in the SyntaxConformance class
*/
public function testMailingNoContactID() {
- $params = array(
- 'something' => 'This is not a real field',
- );
- $this->callAPIFailure('MailingContact', 'get', $params);
+ $this->callAPIFailure('MailingContact', 'get', ['something' => 'This is not a real field']);
}
/**
* belongs in the SyntaxConformance class
*/
public function testMailingContactInvalidContactID() {
- $params = array('contact_id' => 'This is not a number');
- $this->callAPIFailure('MailingContact', 'get', $params);
+ $this->callAPIFailure('MailingContact', 'get', ['contact_id' => 'This is not a number']);
}
/**
* Test that the API returns a mailing properly when there is only one.
*/
public function testMailingContactDelivered() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- //Create the User
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/mailing_contact.xml'
- )
- );
- // Create the Mailing and connections to the user.
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/mailing_delivered.xml'
- )
- );
+ list($contactID, $mailingID, $eventQueueID) = $this->setupEventQueue();
+ CRM_Core_DAO::executeQuery("INSERT INTO civicrm_mailing_event_delivered (event_queue_id) VALUES(%1)", [1 => [$eventQueueID, 'Integer']]);
- $params = array(
- 'contact_id' => 23,
+ $params = [
+ 'contact_id' => $contactID,
'type' => 'Delivered',
- );
+ ];
$result = $this->callAPISuccess('MailingContact', 'get', $params);
$count = $this->callAPISuccess('MailingContact', 'getcount', $params);
$this->assertFalse(empty($result['values']));
$this->assertEquals($result['values'][1]['mailing_id'], 1);
$this->assertEquals($result['values'][1]['subject'], "Some Subject");
- $this->assertEquals($result['values'][1]['creator_id'], 3);
- $this->assertEquals($result['values'][1]['creator_name'], "xyz1, abc1");
+ $this->assertEquals(CRM_Core_Session::getLoggedInContactID(), $result['values'][1]['creator_id']);
}
/**
- * Test that the API returns only the "Bounced" mailings when instructed to do so.
+ * Test that the API returns only the "Bounced" mailings when instructed to
+ * do so.
+ *
+ * @throws \Exception
*/
public function testMailingContactBounced() {
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- // Create the User.
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/mailing_contact.xml'
- )
- );
- // Create the Mailing and connections to the user.
- $op->execute($this->_dbconn,
- $this->createXMLDataSet(
- dirname(__FILE__) . '/dataset/mailing_bounced.xml'
- )
- );
+ list($contactID, $mailingID, $eventQueueID) = $this->setupEventQueue();
+ CRM_Core_DAO::executeQuery("INSERT INTO civicrm_mailing_event_bounce (event_queue_id, bounce_type_id) VALUES(%1, 6)", [1 => [$eventQueueID, 'Integer']]);
- $params = array(
- 'contact_id' => 23,
+ $params = [
+ 'contact_id' => $contactID,
'type' => 'Bounced',
- );
+ ];
- $result = $this->callAPISuccess('MailingContact', 'get', $params);
- $this->assertEquals($result['count'], 1);
- $this->assertFalse(empty($result['values']));
- $this->assertEquals($result['values'][2]['mailing_id'], 2);
- $this->assertEquals($result['values'][2]['subject'], "Some Subject");
- $this->assertEquals($result['values'][2]['creator_id'], 3);
- $this->assertEquals($result['values'][2]['creator_name'], "xyz1, abc1");
+ $result = $this->callAPISuccess('MailingContact', 'get', $params)['values'];
+ $this->assertEquals(1, count($result));
+ $this->assertEquals($mailingID, $result[$mailingID]['mailing_id']);
+ $this->assertEquals('Some Subject', $result[$mailingID]['subject']);
+ $this->assertEquals(CRM_Core_Session::getLoggedInContactID(), $result[$mailingID]['creator_id'], 3);
+ }
+
+ /**
+ * @return array
+ * @throws \Exception
+ */
+ public function setupEventQueue() {
+ $contactID = $this->individualCreate(['first_name' => 'Test']);
+ $emailID = $this->callAPISuccessGetValue('Email', [
+ 'return' => 'id',
+ 'contact_id' => $contactID,
+ ]);
+ $this->createLoggedInUser();
+ $mailingID = $this->callAPISuccess('Mailing', 'create', [
+ 'name' => 'Test Mailing',
+ 'subject' => 'Some Subject',
+ ])['id'];
+ $mailingJobID = $this->callAPISuccess('MailingJob', 'create', ['mailing_id' => $mailingID])['id'];
+ $eventQueueID = $this->callAPISuccess('MailingEventQueue', 'create', [
+ 'contact_id' => $contactID,
+ 'mailing_id' => $mailingID,
+ 'email_id' => $emailID,
+ 'job_id' => $mailingJobID,
+ ])['id'];
+ return [$contactID, $mailingID, $eventQueueID];
}
}
$this->_params = array(
'subject' => 'Hello {contact.display_name}',
'body_text' => "This is {contact.display_name}.\nhttps://civicrm.org\n{domain.address}{action.optOutUrl}",
- 'body_html' => "<link href='https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700|Zilla+Slab:500,700' rel='stylesheet' type='text/css'><p>This is {contact.display_name}.</p><p><a href='https://civicrm.org/'>CiviCRM.org</a></p><p>{domain.address}{action.optOutUrl}</p>",
+ 'body_html' => "<link href='https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700|Zilla+Slab:500,700' rel='stylesheet' type='text/css'><p><a href=\"http://{action.forward}\">Forward this email</a><a href=\"{action.forward}\">Forward this email with no protocol</a></p<p>This is {contact.display_name}.</p><p><a href='https://civicrm.org/'>CiviCRM.org</a></p><p>{domain.address}{action.optOutUrl}</p>",
'name' => 'mailing name',
'created_id' => $this->_contactID,
'header_id' => '',
$this->assertDBQuery($maxIDs['group'], 'SELECT MAX(id) FROM civicrm_mailing_group');
// 'Preview should not create any mailing_recipient records'
$this->assertDBQuery($maxIDs['recipient'], 'SELECT MAX(id) FROM civicrm_mailing_recipients');
-
+ $baseurl = CRM_Utils_System::baseCMSURL();
$previewResult = $result['values'][$result['id']]['api.Mailing.preview'];
$this->assertEquals("Hello $displayName", $previewResult['values']['subject']);
$this->assertContains("This is $displayName", $previewResult['values']['body_text']);
$this->assertContains("<p>This is $displayName.</p>", $previewResult['values']['body_html']);
+ $this->assertContains('<a href="' . $baseurl . 'index.php?q=civicrm/mailing/forward&amp;reset=1&jid=&qid=&h=">Forward this email with no protocol</a>', $previewResult['values']['body_html']);
+ $this->assertNotContains("http://http://", $previewResult['values']['body_html']);
+ }
+
+ public function testMailerPreviewUnknownContact() {
+ $params = $this->_params;
+ $params['api.Mailing.preview'] = array(
+ 'id' => '$value.id',
+ );
+
+ $result = $this->callAPISuccess('mailing', 'create', $params);
+
+ // NOTE: It's highly debatable what's best to do with contact-tokens for an
+ // unknown-contact. However, changes should be purposeful, so we'll test
+ // for the current behavior (i.e. returning blanks).
+ $previewResult = $result['values'][$result['id']]['api.Mailing.preview'];
+ $this->assertEquals("Hello ", $previewResult['values']['subject']);
+ $this->assertContains("This is .", $previewResult['values']['body_text']);
+ $this->assertContains("<p>This is .</p>", $previewResult['values']['body_html']);
}
public function testMailerPreviewRecipients() {
'from_financial_account_id' => 7,
'to_financial_account_id' => 6,
'total_amount' => -30,
- 'status_id' => 1,
+ 'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_FinancialTrxn', 'status_id', 'Refunded'),
'is_payment' => 1,
];
foreach ($expected as $key => $value) {
*/
public function checkPaymentResult($payment, $expectedResult) {
foreach ($expectedResult[$payment['id']] as $key => $value) {
- $this->assertEquals($payment['values'][$payment['id']][$key], $value);
+ $this->assertEquals($payment['values'][$payment['id']][$key], $value, 'mismatch on ' . $key);
}
}
* @group headless
*/
class api_v3_ProfileTest extends CiviUnitTestCase {
- protected $_apiversion;
+
protected $_profileID = 0;
+
protected $_membershipTypeID;
+
protected $_contactID;
+ /**
+ * Set up for test.
+ */
public function setUp() {
- $this->_apiversion = 3;
parent::setUp();
$config = CRM_Core_Config::singleton();
$countryLimit = $config->countryLimit;
$this->_membershipTypeID = $this->membershipTypeCreate();
}
+ /**
+ * Cleanup after test.
+ *
+ * @throws \Exception
+ */
public function tearDown() {
- $this->quickCleanup(array(
+ $this->quickCleanup([
'civicrm_contact',
'civicrm_phone',
'civicrm_address',
'civicrm_membership',
'civicrm_contribution',
'civicrm_uf_match',
- ), TRUE);
- $this->callAPISuccess('membership_type', 'delete', array('id' => $this->_membershipTypeID));
- // ok can't be bothered wring an api to do this & truncating is crazy
- CRM_Core_DAO::executeQuery(" DELETE FROM civicrm_uf_group WHERE id IN ($this->_profileID, 26)");
+ ], TRUE);
+ $this->callAPISuccess('membership_type', 'delete', ['id' => $this->_membershipTypeID]);
+ CRM_Core_DAO::executeQuery(" DELETE FROM civicrm_uf_group WHERE id = $this->_profileID OR name = 'test_contact_activity_profile'");
+ parent::tearDown();
}
/**
* Check Without ProfileId.
*/
public function testProfileGetWithoutProfileId() {
- $this->callAPIFailure('profile', 'get', array('contact_id' => 1),
+ $this->callAPIFailure('profile', 'get', ['contact_id' => 1],
'Mandatory key(s) missing from params array: profile_id'
);
}
* Check with no invalid profile Id.
*/
public function testProfileGetInvalidProfileId() {
- $this->callAPIFailure('profile', 'get', array('contact_id' => 1, 'profile_id' => 1000));
+ $this->callAPIFailure('profile', 'get', [
+ 'contact_id' => 1,
+ 'profile_id' => 1000,
+ ]);
}
/**
$profileFieldValues = $this->_createIndividualContact();
$expected = reset($profileFieldValues);
$contactId = key($profileFieldValues);
- $params = array(
+ $params = [
'profile_id' => $this->_profileID,
'contact_id' => $contactId,
- );
- $result = $this->callAPISuccess('profile', 'get', $params);
+ ];
+ $result = $this->callAPISuccess('profile', 'get', $params)['values'];
foreach ($expected as $profileField => $value) {
- $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result['values']));
+ $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result));
}
}
+ /**
+ * Test getting multiple profiles.
+ */
public function testProfileGetMultiple() {
$profileFieldValues = $this->_createIndividualContact();
$expected = reset($profileFieldValues);
$contactId = key($profileFieldValues);
- $params = array(
- 'profile_id' => array($this->_profileID, 1, 'Billing'),
+ $params = [
+ 'profile_id' => [$this->_profileID, 1, 'Billing'],
'contact_id' => $contactId,
- );
+ ];
- $result = $this->callAPIAndDocument('profile', 'get', $params, __FUNCTION__, __FILE__);
+ $result = $this->callAPIAndDocument('profile', 'get', $params, __FUNCTION__, __FILE__)['values'];
foreach ($expected as $profileField => $value) {
- $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result['values'][$this->_profileID]), " error message: " . "missing/mismatching value for {$profileField}");
+ $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result[$this->_profileID]), " error message: " . "missing/mismatching value for {$profileField}");
}
- $this->assertEquals('abc1', $result['values'][1]['first_name'], " error message: " . "missing/mismatching value for {$profileField}");
- $this->assertFalse(array_key_exists('email-Primary', $result['values'][1]), 'profile 1 doesn not include email');
- $this->assertEquals($result['values']['Billing'], array(
+ $this->assertEquals('abc1', $result[1]['first_name'], " error message: " . "missing/mismatching value for first name");
+ $this->assertFalse(array_key_exists('email-Primary', $result[1]), 'profile 1 does not include email');
+ $this->assertEquals($result['Billing'], [
'billing_first_name' => 'abc1',
'billing_middle_name' => 'J.',
'billing_last_name' => 'xyz1',
'billing_postal_code-5' => '90210',
'billing-email-5' => 'abc1.xyz1@yahoo.com',
'email-5' => 'abc1.xyz1@yahoo.com',
- ));
+ ]);
}
+ /**
+ * Test getting billing profile filled using is_billing.
+ */
public function testProfileGetBillingUseIsBillingLocation() {
$individual = $this->_createIndividualContact();
$contactId = key($individual);
- $this->callAPISuccess('address', 'create', array(
+ $this->callAPISuccess('address', 'create', [
'is_billing' => 1,
'street_address' => 'is billing st',
'location_type_id' => 2,
'contact_id' => $contactId,
- ));
+ ]);
- $params = array(
- 'profile_id' => array($this->_profileID, 1, 'Billing'),
+ $params = [
+ 'profile_id' => [$this->_profileID, 1, 'Billing'],
'contact_id' => $contactId,
- );
+ ];
- $result = $this->callAPISuccess('profile', 'get', $params);
- $this->assertEquals('abc1', $result['values'][1]['first_name']);
- $this->assertEquals(array(
+ $result = $this->callAPISuccess('profile', 'get', $params)['values'];
+ $this->assertEquals('abc1', $result[1]['first_name']);
+ $this->assertEquals([
'billing_first_name' => 'abc1',
'billing_middle_name' => 'J.',
'billing_last_name' => 'xyz1',
'billing-email-5' => 'abc1.xyz1@yahoo.com',
'email-5' => 'abc1.xyz1@yahoo.com',
'billing_postal_code-5' => '',
- ), $result['values']['Billing']);
+ ], $result['Billing']);
}
+ /**
+ * Test getting multiple profiles, including billing.
+ */
public function testProfileGetMultipleHasBillingLocation() {
$individual = $this->_createIndividualContact();
$contactId = key($individual);
- $this->callAPISuccess('address', 'create', array(
+ $this->callAPISuccess('address', 'create', [
'contact_id' => $contactId,
'street_address' => '25 Big Street',
'city' => 'big city',
'location_type_id' => 5,
- ));
- $this->callAPISuccess('email', 'create', array(
+ ]);
+ $this->callAPISuccess('email', 'create', [
'contact_id' => $contactId,
'email' => 'big@once.com',
'location_type_id' => 2,
'is_billing' => 1,
- ));
+ ]);
- $params = array(
- 'profile_id' => array($this->_profileID, 1, 'Billing'),
+ $params = [
+ 'profile_id' => [$this->_profileID, 1, 'Billing'],
'contact_id' => $contactId,
- );
+ ];
$result = $this->callAPISuccess('profile', 'get', $params);
$this->assertEquals('abc1', $result['values'][1]['first_name']);
- $this->assertEquals($result['values']['Billing'], array(
+ $this->assertEquals($result['values']['Billing'], [
'billing_first_name' => 'abc1',
'billing_middle_name' => 'J.',
'billing_last_name' => 'xyz1',
'billing-email-5' => 'big@once.com',
'email-5' => 'big@once.com',
'billing_postal_code-5' => '',
- ));
+ ]);
}
/**
- * Get Billing empty contact - this will return generic defaults
+ * Get Billing empty contact - this will return generic defaults.
*/
public function testProfileGetBillingEmptyContact() {
$this->callAPISuccess('Setting', 'create', ['defaultContactCountry' => 1228]);
- $params = array(
- 'profile_id' => array('Billing'),
- );
+ $params = [
+ 'profile_id' => ['Billing'],
+ ];
- $result = $this->callAPISuccess('profile', 'get', $params);
- $this->assertEquals(array(
+ $result = $this->callAPISuccess('profile', 'get', $params)['values'];
+ $this->assertEquals([
'billing_first_name' => '',
'billing_middle_name' => '',
'billing_last_name' => '',
'billing_email-5' => '',
'email-5' => '',
'billing_postal_code-5' => '',
- ), $result['values']['Billing']);
+ ], $result['Billing']);
}
/**
/**
* Check contact activity profile with wrong activity type.
+ *
+ * @throws \Exception
*/
public function testContactActivityGetWrongActivityType() {
- //flush cache by calling with reset
- $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, TRUE, 'name', TRUE);
-
- $sourceContactId = $this->householdCreate();
-
- $activityparams = array(
- 'source_contact_id' => $sourceContactId,
+ $activity = $this->callAPISuccess('activity', 'create', [
+ 'source_contact_id' => $this->householdCreate(),
'activity_type_id' => '2',
'subject' => 'Test activity',
'activity_date_time' => '20110316',
'duration' => '120',
- 'location' => 'Pensulvania',
+ 'location' => 'Pennsylvania',
'details' => 'a test activity',
'status_id' => '1',
'priority_id' => '1',
- );
-
- $activity = $this->callAPISuccess('activity', 'create', $activityparams);
+ ])['values'];
- $activityValues = array_pop($activity['values']);
+ $activityValues = array_pop($activity);
list($params) = $this->_createContactWithActivity();
public function testGetFields() {
$this->_createIndividualProfile();
$this->_addCustomFieldToProfile($this->_profileID);
- $result = $this->callAPIAndDocument('profile', 'getfields', array(
+ $result = $this->callAPIAndDocument('profile', 'getfields', [
'action' => 'submit',
'profile_id' => $this->_profileID,
- ), __FUNCTION__, __FILE__,
+ ], __FUNCTION__, __FILE__,
'demonstrates retrieving profile fields passing in an id');
$this->assertArrayKeyExists('first_name', $result['values']);
$this->assertEquals('2', $result['values']['first_name']['type']);
}
/**
- * Check getfields works & gives us our fields - partipant profile
+ * Check getfields works & gives us our fields - participant profile
*/
public function testGetFieldsParticipantProfile() {
- $result = $this->callAPISuccess('profile', 'getfields', array(
+ $result = $this->callAPISuccess('profile', 'getfields', [
'action' => 'submit',
'profile_id' => 'participant_status',
'get_options' => 'all',
- ));
+ ]);
$this->assertTrue(array_key_exists('participant_status_id', $result['values']));
$this->assertEquals('Attended', $result['values']['participant_status_id']['options'][2]);
- $this->assertEquals(array('participant_status'), $result['values']['participant_status_id']['api.aliases']);
+ $this->assertEquals(['participant_status'], $result['values']['participant_status_id']['api.aliases']);
}
/**
* (getting to the end with no e-notices is pretty good evidence it's working)
*/
public function testGetFieldsMembershipBatchProfile() {
- $result = $this->callAPISuccess('profile', 'getfields', array(
+ $result = $this->callAPISuccess('profile', 'getfields', [
'action' => 'submit',
'profile_id' => 'membership_batch_entry',
'get_options' => 'all',
- ));
+ ]);
$this->assertTrue(array_key_exists('total_amount', $result['values']));
$this->assertTrue(array_key_exists('financial_type_id', $result['values']));
- $this->assertEquals(array(
+ $this->assertEquals([
'contribution_type_id',
'contribution_type',
'financial_type',
- ), $result['values']['financial_type_id']['api.aliases']);
+ ], $result['values']['financial_type_id']['api.aliases']);
$this->assertTrue(!array_key_exists('financial_type', $result['values']));
$this->assertEquals(12, $result['values']['receive_date']['type']);
}
* (getting to the end with no e-notices is pretty good evidence it's working)
*/
public function testGetFieldsAllProfiles() {
- $result = $this->callAPISuccess('uf_group', 'get', array('return' => 'id'));
- $profileIDs = array_keys($result['values']);
+ $result = $this->callAPISuccess('uf_group', 'get', ['return' => 'id'])['values'];
+ $profileIDs = array_keys($result);
foreach ($profileIDs as $profileID) {
- $this->callAPISuccess('profile', 'getfields', array(
+ $this->callAPISuccess('profile', 'getfields', [
'action' => 'submit',
'profile_id' => $profileID,
'get_options' => 'all',
- ));
+ ]);
}
}
* Check Without ProfileId.
*/
public function testProfileSubmitWithoutProfileId() {
- $params = array(
+ $params = [
'contact_id' => 1,
- );
+ ];
$this->callAPIFailure('profile', 'submit', $params,
'Mandatory key(s) missing from params array: profile_id'
);
* Check with no invalid profile Id.
*/
public function testProfileSubmitInvalidProfileId() {
- $params = array(
+ $params = [
'contact_id' => 1,
'profile_id' => 1000,
- );
- $result = $this->callAPIFailure('profile', 'submit', $params);
+ ];
+ $this->callAPIFailure('profile', 'submit', $params);
}
/**
public function testProfileSubmitCheckProfileRequired() {
$profileFieldValues = $this->_createIndividualContact();
$contactId = key($profileFieldValues);
- $updateParams = array(
+ $updateParams = [
'first_name' => 'abc2',
'last_name' => 'xyz2',
'phone-1-1' => '022 321 826',
'country-1' => '1013',
'state_province-1' => '1000',
- );
+ ];
- $params = array_merge(array('profile_id' => $this->_profileID, 'contact_id' => $contactId),
+ $params = array_merge([
+ 'profile_id' => $this->_profileID,
+ 'contact_id' => $contactId,
+ ],
$updateParams
);
$profileFieldValues = $this->_createIndividualContact();
$contactId = key($profileFieldValues);
- $updateParams = array(
+ $updateParams = [
'first_name' => 'abc2',
'last_name' => 'xyz2',
'email-primary' => 'abc2.xyz2@gmail.com',
'phone-1-1' => '022 321 826',
'country-1' => '1013',
'state_province-1' => '1000',
- );
+ ];
- $params = array_merge(array(
+ $params = array_merge([
'profile_id' => $this->_profileID,
'contact_id' => $contactId,
- ), $updateParams);
+ ], $updateParams);
$this->callAPIAndDocument('profile', 'submit', $params, __FUNCTION__, __FILE__);
- $getParams = array(
+ $getParams = [
'profile_id' => $this->_profileID,
'contact_id' => $contactId,
- );
+ ];
$profileDetails = $this->callAPISuccess('profile', 'get', $getParams);
foreach ($updateParams as $profileField => $value) {
/**
* Ensure caches are being cleared so we don't get into a debugging trap because of cached metadata
- * First we delete & create to increment the version & then check for caching probs
+ * First we delete & create to increment the version & then check for caching problems.
*/
public function testProfileSubmitCheckCaching() {
- $this->callAPISuccess('membership_type', 'delete', array('id' => $this->_membershipTypeID));
+ $this->callAPISuccess('membership_type', 'delete', ['id' => $this->_membershipTypeID]);
$this->_membershipTypeID = $this->membershipTypeCreate();
- $membershipTypes = $this->callAPISuccess('membership_type', 'get', array());
- $profileFields = $this->callAPISuccess('profile', 'getfields', array(
+ $membershipTypes = $this->callAPISuccess('membership_type', 'get', []);
+ $profileFields = $this->callAPISuccess('profile', 'getfields', [
'get_options' => 'all',
'action' => 'submit',
'profile_id' => 'membership_batch_entry',
- ));
- $getoptions = $this->callAPISuccess('membership', 'getoptions', array(
+ ]);
+ $getoptions = $this->callAPISuccess('membership', 'getoptions', [
'field' => 'membership_type',
'context' => 'validate',
- ));
+ ]);
$this->assertEquals(array_keys($membershipTypes['values']), array_keys($getoptions['values']));
$this->assertEquals(array_keys($membershipTypes['values']), array_keys($profileFields['values']['membership_type_id']['options']));
* Test that the fields are returned in the right order despite the faffing around that goes on.
*/
public function testMembershipGetFieldsOrder() {
- $result = $this->callAPISuccess('profile', 'getfields', array(
+ $result = $this->callAPISuccess('profile', 'getfields', [
'action' => 'submit',
'profile_id' => 'membership_batch_entry',
- ));
+ ])['values'];
$weight = 1;
- foreach ($result['values'] as $fieldName => $field) {
+ foreach ($result as $fieldName => $field) {
if ($fieldName == 'profile_id') {
continue;
}
*/
public function testProfileSubmitMembershipBatch() {
$this->_contactID = $this->individualCreate();
- $this->callAPISuccess('profile', 'submit', array(
+ $this->callAPISuccess('profile', 'submit', [
'profile_id' => 'membership_batch_entry',
'financial_type_id' => 1,
'membership_type' => $this->_membershipTypeID,
'contribution_status_id' => 1,
'receive_date' => 'now',
'contact_id' => $this->_contactID,
- ));
+ ]);
}
/**
$profileFieldValues = $this->_createIndividualContact();
$contactId = key($profileFieldValues);
- $updateParams = array(
+ $updateParams = [
'first_name' => 'abc2',
'last_name' => 'xyz2',
'email-Primary' => 'abc2.xyz2@gmail.com',
'phone-1-1' => '022 321 826',
'country-1' => '1013',
'state_province-1' => '1000',
- );
+ ];
- $params = array_merge(array(
+ $params = array_merge([
'profile_id' => $this->_profileID,
'contact_id' => $contactId,
- ), $updateParams);
+ ], $updateParams);
$result = $this->callAPISuccess('profile', 'set', $params);
$this->assertArrayKeyExists('values', $result);
- $getParams = array(
+ $getParams = [
'profile_id' => $this->_profileID,
'contact_id' => $contactId,
- );
+ ];
$profileDetails = $this->callAPISuccess('profile', 'get', $getParams);
foreach ($updateParams as $profileField => $value) {
$params = array_merge($params, $expected);
unset($params['activity_id']);
- $result = $this->callAPIFailure('profile', 'submit', $params);
- $this->assertEquals($result['error_message'], 'Mandatory key(s) missing from params array: activity_id');
+ $this->callAPIFailure('profile', 'submit', $params, 'Mandatory key(s) missing from params array: activity_id');
}
/**
list($params, $expected) = $this->_createContactWithActivity();
$params = array_merge($params, $expected);
$params['activity_id'] = 100001;
- $result = $this->callAPIFailure('profile', 'submit', $params);
- $this->assertEquals($result['error_message'], 'Invalid Activity Id (aid).');
+ $this->callAPIFailure('profile', 'submit', $params, 'Invalid Activity Id (aid).');
}
/**
* Check contact activity profile with wrong activity type.
+ *
+ * @throws \Exception
*/
public function testContactActivitySubmitWrongActivityType() {
- //flush cache by calling with reset
- CRM_Core_PseudoConstant::activityType(TRUE, TRUE, TRUE, 'name', TRUE);
$sourceContactId = $this->householdCreate();
- $activityparams = array(
+ $activityParams = [
'source_contact_id' => $sourceContactId,
'activity_type_id' => '2',
'subject' => 'Test activity',
'activity_date_time' => '20110316',
'duration' => '120',
- 'location' => 'Pensulvania',
+ 'location' => 'Pennsylvania',
'details' => 'a test activity',
'status_id' => '1',
'priority_id' => '1',
- );
+ ];
- $activity = $this->callAPISuccess('activity', 'create', $activityparams);
+ $activity = $this->callAPISuccess('activity', 'create', $activityParams);
$activityValues = array_pop($activity['values']);
public function testContactActivitySubmitSuccess() {
list($params) = $this->_createContactWithActivity();
- $updateParams = array(
+ $updateParams = [
'first_name' => 'abc2',
'last_name' => 'xyz2',
'email-Primary' => 'abc2.xyz2@yahoo.com',
'activity_duration' => '100',
'activity_date_time' => '2010-03-08 00:00:00',
'activity_status_id' => '2',
- );
+ ];
$profileParams = array_merge($params, $updateParams);
$this->callAPISuccess('profile', 'submit', $profileParams);
- $result = $this->callAPISuccess('profile', 'get', $params);
+ $result = $this->callAPISuccess('profile', 'get', $params)['values'];
foreach ($updateParams as $profileField => $value) {
- $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result['values']), " error message: " . "missing/mismatching value for {$profileField}"
+ $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result), " error message: " . "missing/mismatching value for {$profileField}"
);
}
}
* Check profile apply Without ProfileId.
*/
public function testProfileApplyWithoutProfileId() {
- $params = array(
+ $params = [
'contact_id' => 1,
- );
+ ];
$this->callAPIFailure('profile', 'apply', $params,
'Mandatory key(s) missing from params array: profile_id');
}
* Check profile apply with no invalid profile Id.
*/
public function testProfileApplyInvalidProfileId() {
- $params = array(
+ $params = [
'contact_id' => 1,
'profile_id' => 1000,
- );
+ ];
$this->callAPIFailure('profile', 'apply', $params);
}
current($profileFieldValues);
$contactId = key($profileFieldValues);
- $params = array(
+ $params = [
'profile_id' => $this->_profileID,
'contact_id' => $contactId,
'first_name' => 'abc2',
'phone-1-1' => '022 321 826',
'country-1' => '1013',
'state_province-1' => '1000',
- );
+ ];
$result = $this->callAPIAndDocument('profile', 'apply', $params, __FUNCTION__, __FILE__);
// Expected field values
- $expected['contact'] = array(
+ $expected['contact'] = [
'contact_id' => $contactId,
'contact_type' => 'Individual',
'first_name' => 'abc2',
'last_name' => 'xyz2',
- );
- $expected['email'] = array(
+ ];
+ $expected['email'] = [
'location_type_id' => 1,
'is_primary' => 1,
'email' => 'abc2.xyz2@gmail.com',
- );
+ ];
- $expected['phone'] = array(
+ $expected['phone'] = [
'location_type_id' => 1,
'is_primary' => 1,
'phone_type_id' => 1,
'phone' => '022 321 826',
- );
- $expected['address'] = array(
+ ];
+ $expected['address'] = [
'location_type_id' => 1,
'is_primary' => 1,
'country_id' => 1013,
'state_province_id' => 1000,
- );
+ ];
foreach ($expected['contact'] as $field => $value) {
- $this->assertEquals($value, CRM_Utils_Array::value($field, $result['values']), "In line " . __LINE__ . " error message: " . "missing/mismatching value for {$field}"
+ $this->assertEquals($value, CRM_Utils_Array::value($field, $result['values']), "missing/mismatching value for {$field}"
);
}
- foreach (array(
- 'email',
- 'phone',
- 'address',
- ) as $fieldType) {
+ foreach (['email', 'phone', 'address'] as $fieldType) {
$typeValues = array_pop($result['values'][$fieldType]);
foreach ($expected[$fieldType] as $field => $value) {
- $this->assertEquals($value, CRM_Utils_Array::value($field, $typeValues), "In line " . __LINE__ . " error message: " . "missing/mismatching value for {$field} ({$fieldType})"
+ $this->assertEquals($value, CRM_Utils_Array::value($field, $typeValues), "missing/mismatching value for {$field} ({$fieldType})"
);
}
}
$params['profile_id'] = $this->_profileID;
$params['contact_id'] = $contactId;
- $this->callAPISuccess('ufField', 'create', array(
+ $this->callAPISuccess('ufField', 'create', [
'uf_group_id' => $this->_profileID,
'field_name' => 'tag',
'visibility' => 'Public Pages and Listings',
'field_type' => 'Contact',
'label' => 'Tags',
- ));
+ ]);
$tag_1 = $this->callAPISuccess('tag', 'create', ['name' => 'abc'])['id'];
$tag_2 = $this->callAPISuccess('tag', 'create', ['name' => 'def'])['id'];
$params['tag'] = "$tag_1,$tag_2";
- $result = $this->callAPISuccess('profile', 'submit', $params);
+ $this->callAPISuccess('profile', 'submit', $params);
$tags = $this->callAPISuccess('entityTag', 'get', ['entity_id' => $contactId]);
$this->assertEquals(2, $tags['count']);
$params['tag'] = [$tag_1];
- $result = $this->callAPISuccess('profile', 'submit', $params);
+ $this->callAPISuccess('profile', 'submit', $params);
$tags = $this->callAPISuccess('entityTag', 'get', ['entity_id' => $contactId]);
$this->assertEquals(1, $tags['count']);
$params['tag'] = '';
- $result = $this->callAPISuccess('profile', 'submit', $params);
+ $this->callAPISuccess('profile', 'submit', $params);
$tags = $this->callAPISuccess('entityTag', 'get', ['entity_id' => $contactId]);
$this->assertEquals(0, $tags['count']);
/**
* Check success with a note.
+ *
+ * @throws \Exception
*/
public function testSubmitWithNote() {
$profileFieldValues = $this->_createIndividualContact();
$params['profile_id'] = $this->_profileID;
$params['contact_id'] = $contactId;
- $this->callAPISuccess('ufField', 'create', array(
+ $this->callAPISuccess('ufField', 'create', [
'uf_group_id' => $this->_profileID,
'field_name' => 'note',
'visibility' => 'Public Pages and Listings',
'field_type' => 'Contact',
'label' => 'Note',
- ));
+ ]);
$params['note'] = "Hello 123";
$this->callAPISuccess('profile', 'submit', $params);
/**
* Check handling a custom greeting.
+ *
+ * @throws \CiviCRM_API3_Exception
*/
public function testSubmitGreetingFields() {
$profileFieldValues = $this->_createIndividualContact();
$params['profile_id'] = $this->_profileID;
$params['contact_id'] = $contactId;
- $this->callAPISuccess('ufField', 'create', array(
+ $this->callAPISuccess('ufField', 'create', [
'uf_group_id' => $this->_profileID,
'field_name' => 'email_greeting',
'visibility' => 'Public Pages and Listings',
'field_type' => 'Contact',
'label' => 'Email Greeting',
- ));
+ ]);
$emailGreetings = array_column(civicrm_api3('OptionValue', 'get', ['option_group_id' => "email_greeting"])['values'], NULL, 'name');
/**
* Helper function to create an Individual with address/email/phone info. Import UF Group and UF Fields
+ *
* @param array $params
*
* @return mixed
*/
- public function _createIndividualContact($params = array()) {
- $contactParams = array_merge(array(
+ public function _createIndividualContact($params = []) {
+ $contactParams = array_merge([
'first_name' => 'abc1',
'last_name' => 'xyz1',
'email' => 'abc1.xyz1@yahoo.com',
- 'api.address.create' => array(
+ 'api.address.create' => [
'location_type_id' => 1,
'is_primary' => 1,
'street_address' => '5 Saint Helier St',
'postal_code' => '90210',
'city' => 'Gotham City',
'is_billing' => 0,
- ),
- 'api.phone.create' => array(
+ ],
+ 'api.phone.create' => [
'location_type_id' => '1',
'phone' => '021 512 755',
'phone_type_id' => '1',
'is_primary' => '1',
- ),
- ), $params);
+ ],
+ ], $params);
$this->_contactID = $this->individualCreate($contactParams);
$this->_createIndividualProfile();
// expected result of above created profile with contact Id $contactId
- $profileData[$this->_contactID] = array(
+ $profileData[$this->_contactID] = [
'first_name' => 'abc1',
'last_name' => 'xyz1',
'email-primary' => 'abc1.xyz1@yahoo.com',
'phone-1-1' => '021 512 755',
'country-1' => '1228',
'state_province-1' => '1021',
- );
+ ];
return $profileData;
}
* @return array
*/
public function _createContactWithActivity() {
- // @TODO: Create profile with custom fields
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/dataset/uf_group_contact_activity_26.xml'
- )
- );
- // hack: xml data set do not accept \ 1 (CRM_Core_DAO::VALUE_SEPARATOR)
- CRM_Core_DAO::setFieldValue('CRM_Core_DAO_UFGroup', '26', 'group_type', 'Individual,Contact,Activity' . CRM_Core_DAO::VALUE_SEPARATOR . 'ActivityType:1');
+ $ufGroupID = $this->callAPISuccess('UFGroup', 'create', [
+ 'group_type' => 'Individual,Contact,Activity',
+ 'title' => 'Test Contact-Activity Profile',
+ 'name' => 'test_contact_activity_profile',
+ ])['id'];
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'first_name',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'First Name',
+ 'field_type' => 'Individual',
+ ]);
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'last_name',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'Last Name',
+ 'field_type' => 'Individual',
+ ]);
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'email',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'Email',
+ 'field_type' => 'Contact',
+ ]);
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'activity_subject',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'Activity Subject',
+ 'is_searchable' => TRUE,
+ 'field_type' => 'Activity',
+ ]);
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'activity_details',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'Activity Details',
+ 'is_searchable' => TRUE,
+ 'field_type' => 'Activity',
+ ]);
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'activity_duration',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'Activity Duration',
+ 'is_searchable' => TRUE,
+ 'field_type' => 'Activity',
+ ]);
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'activity_date_time',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'Activity Date',
+ 'is_searchable' => TRUE,
+ 'field_type' => 'Activity',
+ ]);
+ $this->callAPISuccess('UFField', 'create', [
+ 'uf_group_id' => $ufGroupID,
+ 'field_name' => 'activity_status_id',
+ 'is_required' => TRUE,
+ 'visibility' => 'Public Pages and Listings',
+ 'label' => 'Activity Status',
+ 'is_searchable' => TRUE,
+ 'field_type' => 'Activity',
+ ]);
+
+ // hack: xml data set did not accept \ 1 (CRM_Core_DAO::VALUE_SEPARATOR) - should be possible
+ // to unhack now we use the api.
+ CRM_Core_DAO::setFieldValue('CRM_Core_DAO_UFGroup', $ufGroupID, 'group_type', 'Individual,Contact,Activity' . CRM_Core_DAO::VALUE_SEPARATOR . 'ActivityType:1');
$sourceContactId = $this->individualCreate();
- $contactParams = array(
+ $contactParams = [
'first_name' => 'abc1',
'last_name' => 'xyz1',
'contact_type' => 'Individual',
'email' => 'abc1.xyz1@yahoo.com',
- 'api.address.create' => array(
+ 'api.address.create' => [
'location_type_id' => 1,
'is_primary' => 1,
'name' => 'Saint Helier St',
'supplemental_address_1' => 'Hallmark Ct',
'supplemental_address_2' => 'Jersey Village',
'supplemental_address_3' => 'My Town',
- ),
- );
+ ],
+ ];
$contact = $this->callAPISuccess('contact', 'create', $contactParams);
$this->assertEquals(0, $contact['values'][$contactId]['api.address.create']['is_error'], " error message: " . CRM_Utils_Array::value('error_message', $contact['values'][$contactId]['api.address.create'])
);
- $activityParams = array(
+ $activityParams = [
'source_contact_id' => $sourceContactId,
'assignee_contact_id' => $contactId,
'activity_type_id' => '1',
'subject' => 'Make-it-Happen Meeting',
'activity_date_time' => '2011-03-16 00:00:00',
'duration' => '120',
- 'location' => 'Pensulvania',
+ 'location' => 'Pennsylvania',
'details' => 'a test activity',
'status_id' => '1',
'priority_id' => '1',
- );
+ ];
$activity = $this->callAPISuccess('activity', 'create', $activityParams);
$activityValues = array_pop($activity['values']);
// valid parameters for above profile
- $profileParams = array(
- 'profile_id' => 26,
+ $profileParams = [
+ 'profile_id' => $ufGroupID,
'contact_id' => $contactId,
'activity_id' => $activityValues['id'],
- );
+ ];
// expected result of above created profile
- $expected = array(
+ $expected = [
'first_name' => 'abc1',
'last_name' => 'xyz1',
'email-Primary' => 'abc1.xyz1@yahoo.com',
'activity_duration' => '120',
'activity_date_time' => '2011-03-16 00:00:00',
'activity_status_id' => '1',
- );
+ ];
- return array($profileParams, $expected);
+ return [$profileParams, $expected];
}
/**
* Create a profile.
*/
public function _createIndividualProfile() {
- $ufGroupParams = array(
+ $ufGroupParams = [
'group_type' => 'Individual,Contact',
// really we should remove this & test the ufField create sets it
'name' => 'test_individual_contact_profile',
'title' => 'Flat Coffee',
- 'api.uf_field.create' => array(
- array(
+ 'api.uf_field.create' => [
+ [
'field_name' => 'first_name',
'is_required' => 1,
'visibility' => 'Public Pages and Listings',
'field_type' => 'Individual',
'label' => 'First Name',
- ),
- array(
+ ],
+ [
'field_name' => 'last_name',
'is_required' => 1,
'visibility' => 'Public Pages and Listings',
'field_type' => 'Individual',
'label' => 'Last Name',
- ),
- array(
+ ],
+ [
'field_name' => 'email',
'is_required' => 1,
'visibility' => 'Public Pages and Listings',
'field_type' => 'Contact',
'label' => 'Email',
- ),
- array(
+ ],
+ [
'field_name' => 'phone',
'is_required' => 1,
'visibility' => 'Public Pages and Listings',
'location_type_id' => 1,
'phone_type_id' => 1,
'label' => 'Phone',
- ),
- array(
+ ],
+ [
'field_name' => 'country',
'is_required' => 1,
'visibility' => 'Public Pages and Listings',
'field_type' => 'Contact',
'location_type_id' => 1,
'label' => 'Country',
- ),
- array(
+ ],
+ [
'field_name' => 'state_province',
'is_required' => 1,
'visibility' => 'Public Pages and Listings',
'field_type' => 'Contact',
'location_type_id' => 1,
'label' => 'State Province',
- ),
- array(
+ ],
+ [
'field_name' => 'postal_code',
'is_required' => 0,
'field_type' => 'Contact',
'location_type_id' => 1,
'label' => 'State Province',
- ),
- ),
- );
+ ],
+ ],
+ ];
$profile = $this->callAPISuccess('uf_group', 'create', $ufGroupParams);
$this->_profileID = $profile['id'];
}
*/
public function _addCustomFieldToProfile($profileID) {
$ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, '');
- $this->uFFieldCreate(array(
+ $this->uFFieldCreate([
'uf_group_id' => $profileID,
'field_name' => 'custom_' . $ids['custom_field_id'],
'contact_type' => 'Contact',
- ));
+ ]);
}
}
* @group headless
*/
class api_v3_RelationshipTest extends CiviUnitTestCase {
+
+ use CRMTraits_Custom_CustomDataTrait;
+
protected $_apiversion = 3;
protected $_cId_a;
/**
* Second individual.
- * @var integer
+ *
+ * @var int
*/
protected $_cId_a_2;
protected $_cId_b;
*/
protected $_cId_b2;
protected $_relTypeID;
- protected $_ids = array();
- protected $_customGroupId = NULL;
+ protected $_ids = [];
protected $_customFieldId = NULL;
protected $_params;
- protected $_entity;
+ protected $entity;
/**
* Set up function.
));
$this->_cId_b = $this->organizationCreate();
$this->_cId_b2 = $this->organizationCreate(array('organization_name' => ' Org 2'));
- $this->_entity = 'relationship';
+ $this->entity = 'Relationship';
//Create a relationship type.
$relTypeParams = array(
'name_a_b' => 'Relation 1 for delete',
* Check relationship creation with custom data.
*/
public function testRelationshipCreateEditWithCustomData() {
- $this->createCustomGroup();
- $this->_ids = $this->createCustomField();
+ $this->createCustomGroupWithFieldsOfAllTypes();
//few custom Values for comparing
- $custom_params = array(
- "custom_{$this->_ids[0]}" => 'Hello! this is custom data for relationship',
- "custom_{$this->_ids[1]}" => 'Y',
- "custom_{$this->_ids[2]}" => '2009-07-11 00:00:00',
- "custom_{$this->_ids[3]}" => 'http://example.com',
- );
-
- $params = array(
+ $custom_params = [
+ $this->getCustomFieldName('text') => 'Hello! this is custom data for relationship',
+ $this->getCustomFieldName('select_string') => 'Y',
+ $this->getCustomFieldName('select_date') => '2009-07-11 00:00:00',
+ $this->getCustomFieldName('link') => 'http://example.com',
+ ];
+
+ $params = [
'contact_id_a' => $this->_cId_a,
'contact_id_b' => $this->_cId_b,
'relationship_type_id' => $this->_relTypeID,
'start_date' => '2008-12-20',
'is_active' => 1,
- );
+ ];
$params = array_merge($params, $custom_params);
$result = $this->callAPISuccess('relationship', 'create', $params);
- $relationParams = array(
- 'id' => $result['id'],
- );
+ $relationParams = ['id' => $result['id']];
$this->assertDBState('CRM_Contact_DAO_Relationship', $result['id'], $relationParams);
//Test Edit of custom field from the form.
$getParams = array('id' => $result['id']);
$updateParams = array_merge($getParams, array(
- "custom_{$this->_ids[0]}" => 'Edited Text Value',
+ $this->getCustomFieldName('text') => 'Edited Text Value',
'relationship_type_id' => $this->_relTypeID . '_b_a',
'related_contact_id' => $this->_cId_a,
));
$reln->submit($updateParams);
$check = $this->callAPISuccess('relationship', 'get', $getParams);
- $this->assertEquals("Edited Text Value", $check['values'][$check['id']]["custom_{$this->_ids[0]}"]);
+ $this->assertEquals("Edited Text Value", $check['values'][$check['id']][$this->getCustomFieldName('text')]);
$params['id'] = $result['id'];
$this->callAPISuccess('relationship', 'delete', $params);
$params = $this->_params;
$params['custom_' . $ids['custom_field_id']] = "custom string";
- $result = $this->callAPISuccess($this->_entity, 'create', $params);
+ $result = $this->callAPISuccess($this->entity, 'create', $params);
$this->assertEquals($result['id'], $result['values'][$result['id']]['id']);
$getParams = array('id' => $result['id']);
- $check = $this->callAPIAndDocument($this->_entity, 'get', $getParams, __FUNCTION__, __FILE__);
+ $check = $this->callAPIAndDocument($this->entity, 'get', $getParams, __FUNCTION__, __FILE__);
$this->assertEquals("custom string", $check['values'][$check['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__);
$this->customFieldDelete($ids['custom_field_id']);
$this->customGroupDelete($ids['custom_group_id']);
}
- /**
- * @return mixed
- */
- public function createCustomGroup() {
- $params = array(
- 'title' => 'Custom Group',
- 'extends' => array('Relationship'),
- 'weight' => 5,
- 'style' => 'Inline',
- 'is_active' => 1,
- 'max_multiple' => 0,
- );
- $customGroup = $this->callAPISuccess('custom_group', 'create', $params);
- $this->_customGroupId = $customGroup['id'];
- return $customGroup['id'];
- }
-
- /**
- * @return array
- */
- public function createCustomField() {
- $ids = array();
- $params = array(
- 'custom_group_id' => $this->_customGroupId,
- 'label' => 'Enter text about relationship',
- 'html_type' => 'Text',
- 'data_type' => 'String',
- 'default_value' => 'xyz',
- 'weight' => 1,
- 'is_required' => 1,
- 'is_searchable' => 0,
- 'is_active' => 1,
- );
-
- $customField = $this->callAPISuccess('CustomField', 'create', $params);
- $ids[] = $customField['id'];
-
- $optionValue[] = array(
- 'label' => 'Red',
- 'value' => 'R',
- 'weight' => 1,
- 'is_active' => 1,
- );
- $optionValue[] = array(
- 'label' => 'Yellow',
- 'value' => 'Y',
- 'weight' => 2,
- 'is_active' => 1,
- );
- $optionValue[] = array(
- 'label' => 'Green',
- 'value' => 'G',
- 'weight' => 3,
- 'is_active' => 1,
- );
-
- $params = array(
- 'label' => 'Pick Color',
- 'html_type' => 'Select',
- 'data_type' => 'String',
- 'weight' => 2,
- 'is_required' => 1,
- 'is_searchable' => 0,
- 'is_active' => 1,
- 'option_values' => $optionValue,
- 'custom_group_id' => $this->_customGroupId,
- );
-
- $customField = $this->callAPISuccess('custom_field', 'create', $params);
- $ids[] = $customField['id'];
-
- $params = array(
- 'custom_group_id' => $this->_customGroupId,
- 'name' => 'test_date',
- 'label' => 'test_date',
- 'html_type' => 'Select Date',
- 'data_type' => 'Date',
- 'default_value' => '20090711',
- 'weight' => 3,
- 'is_required' => 1,
- 'is_searchable' => 0,
- 'is_active' => 1,
- );
-
- $customField = $this->callAPISuccess('custom_field', 'create', $params);
-
- $ids[] = $customField['id'];
- $params = array(
- 'custom_group_id' => $this->_customGroupId,
- 'name' => 'test_link',
- 'label' => 'test_link',
- 'html_type' => 'Link',
- 'data_type' => 'Link',
- 'default_value' => 'http://civicrm.org',
- 'weight' => 4,
- 'is_required' => 1,
- 'is_searchable' => 0,
- 'is_active' => 1,
- );
-
- $customField = $this->callAPISuccess('custom_field', 'create', $params);
- $ids[] = $customField['id'];
- return $ids;
- }
-
/**
* Check with empty array.
*/
* should be OK if the custom field values differ.
*/
public function testRelationshipCreateDuplicateWithCustomFields() {
- $this->createCustomGroup();
- $this->_ids = $this->createCustomField();
+ $this->createCustomGroupWithFieldsOfAllTypes();
$custom_params_1 = array(
- "custom_{$this->_ids[0]}" => 'Hello! this is custom data for relationship',
- "custom_{$this->_ids[1]}" => 'Y',
- "custom_{$this->_ids[2]}" => '2009-07-11 00:00:00',
- "custom_{$this->_ids[3]}" => 'http://example.com',
+ $this->getCustomFieldName('text') => 'Hello! this is custom data for relationship',
+ $this->getCustomFieldName('select_string') => 'Y',
+ $this->getCustomFieldName('select_date') => '2009-07-11 00:00:00',
+ $this->getCustomFieldName('link') => 'http://example.com',
);
$custom_params_2 = array(
- "custom_{$this->_ids[0]}" => 'Hello! this is other custom data',
- "custom_{$this->_ids[1]}" => 'Y',
- "custom_{$this->_ids[2]}" => '2009-07-11 00:00:00',
- "custom_{$this->_ids[3]}" => 'http://example.org',
+ $this->getCustomFieldName('text') => 'Hello! this is other custom data',
+ $this->getCustomFieldName('select_string') => 'Y',
+ $this->getCustomFieldName('select_date') => '2009-07-11 00:00:00',
+ $this->getCustomFieldName('link') => 'http://example.org',
);
$params = array(
* does.
*/
public function testRelationshipCreateDuplicateWithCustomFields2() {
- $this->createCustomGroup();
- $this->_ids = $this->createCustomField();
+ $this->createCustomGroupWithFieldsOfAllTypes();
$custom_params_2 = array(
- "custom_{$this->_ids[0]}" => 'Hello! this is other custom data',
- "custom_{$this->_ids[1]}" => 'Y',
- "custom_{$this->_ids[2]}" => '2009-07-11 00:00:00',
- "custom_{$this->_ids[3]}" => 'http://example.org',
+ $this->getCustomFieldName('text') => 'Hello! this is other custom data',
+ $this->getCustomFieldName('select_string') => 'Y',
+ $this->getCustomFieldName('select_date') => '2009-07-11 00:00:00',
+ $this->getCustomFieldName('link') => 'http://example.org',
);
- $params_1 = array(
+ $params_1 = [
'contact_id_a' => $this->_cId_a,
'contact_id_b' => $this->_cId_b,
'relationship_type_id' => $this->_relTypeID,
'start_date' => '2008-12-20',
'is_active' => 1,
- );
+ ];
$params_2 = array_merge($params_1, $custom_params_2);
* does not.
*/
public function testRelationshipCreateDuplicateWithCustomFields3() {
- $this->createCustomGroup();
- $this->_ids = $this->createCustomField();
+ $this->createCustomGroupWithFieldsOfAllTypes();
- $custom_params_1 = array(
- "custom_{$this->_ids[0]}" => 'Hello! this is other custom data',
- "custom_{$this->_ids[1]}" => 'Y',
- "custom_{$this->_ids[2]}" => '2009-07-11 00:00:00',
- "custom_{$this->_ids[3]}" => 'http://example.org',
- );
+ $custom_params_1 = [
+ $this->getCustomFieldName('text') => 'Hello! this is other custom data',
+ $this->getCustomFieldName('select_string') => 'Y',
+ $this->getCustomFieldName('select_date') => '2009-07-11 00:00:00',
+ $this->getCustomFieldName('link') => 'http://example.org',
+ ];
$params_2 = array(
'contact_id_a' => $this->_cId_a,
* an incorrect one
*/
public function testGetRelationshipByTypeReciprocal() {
- $created = $this->callAPISuccess($this->_entity, 'create', $this->_params);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $created = $this->callAPISuccess($this->entity, 'create', $this->_params);
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id' => $this->_cId_a,
'relationship_type_id' => $this->_relTypeID,
));
$this->assertEquals(1, $result['count']);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id' => $this->_cId_a,
'relationship_type_id' => $this->_relTypeID + 1,
));
$this->assertEquals(0, $result['count']);
- $this->callAPISuccess($this->_entity, 'delete', array('id' => $created['id']));
+ $this->callAPISuccess($this->entity, 'delete', array('id' => $created['id']));
}
/**
* an incorrect one
*/
public function testGetRelationshipByTypeDAO() {
- $this->_ids['relationship'] = $this->callAPISuccess($this->_entity, 'create', array('format.only_id' => TRUE) +
+ $this->_ids['relationship'] = $this->callAPISuccess($this->entity, 'create', array('format.only_id' => TRUE) +
$this->_params);
- $this->callAPISuccess($this->_entity, 'getcount', array(
+ $this->callAPISuccess($this->entity, 'getcount', array(
'contact_id_a' => $this->_cId_a,
), 1);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id_a' => $this->_cId_a,
'relationship_type_id' => $this->_relTypeID,
));
$this->assertEquals(1, $result['count']);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id_a' => $this->_cId_a,
'relationship_type_id' => $this->_relTypeID + 1,
));
* an incorrect one
*/
public function testGetRelationshipByTypeArrayDAO() {
- $this->callAPISuccess($this->_entity, 'create', $this->_params);
+ $this->callAPISuccess($this->entity, 'create', $this->_params);
$org3 = $this->organizationCreate();
// lets just assume built in ones aren't being messed with!
$relType2 = 5;
$relType3 = 6;
// Relationship 2.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType2,
'contact_id_b' => $this->_cId_b2,
);
// Relationship 3.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType3,
'contact_id_b' => $org3,
))
);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id_a' => $this->_cId_a,
'relationship_type_id' => array('IN' => array($this->_relTypeID, $relType3)),
));
* an incorrect one
*/
public function testGetRelationshipByTypeArrayReciprocal() {
- $this->callAPISuccess($this->_entity, 'create', $this->_params);
+ $this->callAPISuccess($this->entity, 'create', $this->_params);
$org3 = $this->organizationCreate();
// lets just assume built in ones aren't being messed with!
$relType2 = 5;
$relType3 = 6;
// Relationship 2.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType2,
'contact_id_b' => $this->_cId_b2,
);
// Relationship 3.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType3,
'contact_id_b' => $org3,
))
);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id' => $this->_cId_a,
'relationship_type_id' => array('IN' => array($this->_relTypeID, $relType3)),
));
* an incorrect one
*/
public function testGetRelationshipByMembershipTypeDAO() {
- $this->callAPISuccess($this->_entity, 'create', $this->_params);
+ $this->callAPISuccess($this->entity, 'create', $this->_params);
$org3 = $this->organizationCreate();
// lets just assume built in ones aren't being messed with!
));
// Relationship 2.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType2,
'contact_id_b' => $this->_cId_b2,
);
// Relationship 3.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType3,
'contact_id_b' => $org3,
);
// Relationship 4 with reversal.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType1,
'contact_id_a' => $this->_cId_a,
))
);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id_a' => $this->_cId_a,
'membership_type_id' => $memberType,
));
* an incorrect one
*/
public function testGetRelationshipByMembershipTypeReciprocal() {
- $this->callAPISuccess($this->_entity, 'create', $this->_params);
+ $this->callAPISuccess($this->entity, 'create', $this->_params);
$org3 = $this->organizationCreate();
// Let's just assume built in ones aren't being messed with!
));
// Relationship 2.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType2,
'contact_id_b' => $this->_cId_b2,
);
// Relationship 4.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType3,
'contact_id_b' => $org3,
);
// Relationship 4 with reversal.
- $this->callAPISuccess($this->_entity, 'create',
+ $this->callAPISuccess($this->entity, 'create',
array_merge($this->_params, array(
'relationship_type_id' => $relType1,
'contact_id_a' => $this->_cId_a,
))
);
- $result = $this->callAPISuccess($this->_entity, 'get', array(
+ $result = $this->callAPISuccess($this->entity, 'get', array(
'contact_id' => $this->_cId_a,
'membership_type_id' => $memberType,
));
* Check for e-notices on enable & disable as reported in CRM-14350
*/
public function testSetActive() {
- $relationship = $this->callAPISuccess($this->_entity, 'create', $this->_params);
- $this->callAPISuccess($this->_entity, 'create', array('id' => $relationship['id'], 'is_active' => 0));
- $this->callAPISuccess($this->_entity, 'create', array('id' => $relationship['id'], 'is_active' => 1));
+ $relationship = $this->callAPISuccess($this->entity, 'create', $this->_params);
+ $this->callAPISuccess($this->entity, 'create', array('id' => $relationship['id'], 'is_active' => 0));
+ $this->callAPISuccess($this->entity, 'create', array('id' => $relationship['id'], 'is_active' => 1));
}
/**
use CRMTraits_ACL_PermissionTrait;
use CRMTraits_PCP_PCPTestTrait;
- protected $_apiversion = 3;
-
protected $contactIDs = [];
/**
*/
public function testReportTemplateGetRowsContactSummary() {
$description = "Retrieve rows from a report template (optionally providing the instance_id).";
- $result = $this->callApiSuccess('report_template', 'getrows', array(
+ $result = $this->callAPISuccess('report_template', 'getrows', array(
'report_id' => 'contact/summary',
'options' => array('metadata' => array('labels', 'title')),
), __FUNCTION__, __FILE__, $description, 'Getrows');
*/
public function testReportTemplateGetRowsMailingUniqueOpened() {
$description = "Retrieve rows from a mailing opened report template.";
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute($this->_dbconn,
- $this->createFlatXMLDataSet(
- dirname(__FILE__) . '/../../CRM/Mailing/BAO/queryDataset.xml'
- )
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/../../CRM/Mailing/BAO/queryDataset.xml');
// Check total rows without distinct
global $_REQUEST;
return array(array('member/detail'));
}
+ /**
+ * Get the membership and contribution reports to test.
+ *
+ * @return array
+ */
public static function getMembershipAndContributionReportTemplatesForGroupTests() {
$templates = array_merge(self::getContributionReportTemplates(), self::getMembershipReportTemplates());
foreach ($templates as $key => $value) {
);
$c3 = $this->contributionCreate($contribution3params);
// Now the soft contribution.
- $p = array(
+ $p = [
'contribution_id' => $c3,
'pcp_id' => $pcp2->id,
'contact_id' => $pcpOwnerContact2Id,
'amount' => 200.00,
'currency' => 'USD',
'soft_credit_type_id' => $pcp_soft_credit_type_id,
- );
+ ];
$this->callAPISuccess('contribution_soft', 'create', $p);
$template = 'contribute/pcp';
$this->assertEquals(2, $values['civicrm_contribution_soft_soft_id_count'], "Total donors should be 2");
}
+ /**
+ * Test a report that uses getAddressColumns();
+ */
+ public function testGetAddressColumns() {
+ $template = 'event/participantlisting';
+ $this->callAPISuccess('report_template', 'getrows', [
+ 'report_id' => $template,
+ 'fields' => [
+ 'sort_name' => '1',
+ 'street_address' => '1',
+ ],
+ ]);
+ }
+
}
public function testGetFieldsCaching() {
$settingsMetadata = array();
Civi::cache('settings')->set('settingsMetadata_' . \CRM_Core_Config::domainID() . '_', $settingsMetadata);
- Civi::cache('settings')->set(\Civi\Core\SettingsMetadata::ALL, $settingsMetadata);
$result = $this->callAPISuccess('setting', 'getfields', array());
$this->assertArrayNotHasKey('customCSSURL', $result['values']);
$this->quickCleanup(array('civicrm_cache'));
'Profile',
'CustomValue',
'UFJoin',
- 'UFField',
'Relationship',
'RelationshipType',
'Note',
'ignore_severity',
),
),
+ 'UFField' => array(
+ 'cant_update' => array(
+ // These fields get auto-adjusted by the BAO prior to saving
+ 'weight',
+ 'location_type_id',
+ 'phone_type_id',
+ 'website_type_id',
+ // Not a real field
+ 'option.autoweight',
+ ),
+ 'break_return' => array(
+ // These fields get auto-adjusted by the BAO prior to saving
+ 'weight',
+ 'field_type',
+ 'location_type_id',
+ 'phone_type_id',
+ 'website_type_id',
+ // Not a real field
+ 'option.autoweight',
+ ),
+ ),
'JobLog' => array(
// For better or worse triggers override.
'break_return' => ['run_time'],
'id' => $entity['id'],
$field => isset($entity[$field]) ? $entity[$field] : NULL,
);
- if (!empty($specs['serialize'])) {
- $updateParams[$field] = $entity[$field] = (array) $specs['serialize'];
- }
if (isset($updateParams['financial_type_id']) && in_array($entityName, array('Grant'))) {
//api has special handling on these 2 fields for backward compatibility reasons
$entity['contribution_type_id'] = $updateParams['financial_type_id'];
protected $ids = array();
/**
* Tag id.
- * @var integer
+ *
+ * @var int
*/
protected $tag = array();
/**
* Test class for UFGroup API - civicrm_uf_*
+ *
* @todo Split UFGroup and UFJoin tests
*
* @package CiviCRM
* @group headless
*/
class api_v3_UFFieldTest extends CiviUnitTestCase {
+
/**
* ids from the uf_group_test.xml fixture
+ *
* @var int
*/
protected $_ufGroupId = 11;
+
protected $_ufFieldId;
+
protected $_contactId = 69;
- protected $_apiversion = 3;
+
protected $_params;
+
protected $_entity = 'uf_field';
/**
protected function setUp() {
parent::setUp();
$this->quickCleanup(
- array(
+ [
'civicrm_group',
'civicrm_contact',
'civicrm_uf_group',
'civicrm_uf_field',
'civicrm_uf_join',
'civicrm_uf_match',
- )
+ ]
);
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute(
- $this->_dbconn,
- $this->createFlatXMLDataSet(dirname(__FILE__) . '/dataset/uf_group_test.xml')
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/dataset/uf_group_test.xml');
- $this->callAPISuccess('uf_field', 'getfields', array('cache_clear' => 1));
+ $this->callAPISuccess('uf_field', 'getfields', ['cache_clear' => 1]);
- $this->_params = array(
+ $this->_params = [
'field_name' => 'phone',
'field_type' => 'Contact',
'visibility' => 'Public Pages and Listings',
'location_type_id' => 1,
'phone_type_id' => 1,
'uf_group_id' => $this->_ufGroupId,
- );
+ ];
}
/**
*/
public function tearDown() {
$this->quickCleanup(
- array(
+ [
'civicrm_group',
'civicrm_contact',
'civicrm_uf_group',
'civicrm_uf_join',
'civicrm_uf_match',
- )
+ ]
);
}
* Failure test for bad parameters.
*/
public function testCreateUFFieldWithWrongParams() {
- $this->callAPIFailure('uf_field', 'create', array('field_name' => 'test field'));
- $this->callAPIFailure('uf_field', 'create', array('label' => 'name-less field'));
+ $this->callAPIFailure('uf_field', 'create', ['field_name' => 'test field']);
+ $this->callAPIFailure('uf_field', 'create', ['label' => 'name-less field']);
}
/**
$params1 = $this->_params;
$ufField1 = $this->callAPISuccess('uf_field', 'create', $params1);
$this->assertEquals(1, $ufField1['values'][$ufField1['id']]['weight']);
- $this->assertDBQuery(1, 'SELECT weight FROM civicrm_uf_field WHERE id = %1', array(
- 1 => array($ufField1['id'], 'Int'),
- ));
+ $this->assertDBQuery(1, 'SELECT weight FROM civicrm_uf_field WHERE id = %1', [
+ 1 => [$ufField1['id'], 'Int'],
+ ]);
$params2 = $this->_params;
// needs to be a different field
$params2['location_type_id'] = 2;
$ufField2 = $this->callAPISuccess('uf_field', 'create', $params2);
$this->assertEquals(1, $ufField2['values'][$ufField2['id']]['weight']);
- $this->assertDBQuery(1, 'SELECT weight FROM civicrm_uf_field WHERE id = %1', array(
- 1 => array($ufField2['id'], 'Int'),
- ));
- $this->assertDBQuery(2, 'SELECT weight FROM civicrm_uf_field WHERE id = %1', array(
- 1 => array($ufField1['id'], 'Int'),
- ));
+ $this->assertDBQuery(1, 'SELECT weight FROM civicrm_uf_field WHERE id = %1', [
+ 1 => [$ufField2['id'], 'Int'],
+ ]);
+ $this->assertDBQuery(2, 'SELECT weight FROM civicrm_uf_field WHERE id = %1', [
+ 1 => [$ufField1['id'], 'Int'],
+ ]);
}
/**
*/
public function testDeleteUFField() {
$ufField = $this->callAPISuccess('uf_field', 'create', $this->_params);
- $params = array(
+ $params = [
'field_id' => $ufField['id'],
- );
+ ];
$this->callAPIAndDocument('uf_field', 'delete', $params, __FUNCTION__, __FILE__);
}
*/
public function testGetUFFieldSuccess() {
$this->callAPISuccess($this->_entity, 'create', $this->_params);
- $result = $this->callAPIAndDocument($this->_entity, 'get', array(), __FUNCTION__, __FILE__);
+ $result = $this->callAPIAndDocument($this->_entity, 'get', [], __FUNCTION__, __FILE__);
$this->getAndCheck($this->_params, $result['id'], $this->_entity);
}
* Create / updating field.
*/
public function testReplaceUFFields() {
- $baseFields = array();
- $baseFields[] = array(
+ $baseFields = [];
+ $baseFields[] = [
'field_name' => 'first_name',
'field_type' => 'Contact',
'visibility' => 'Public Pages and Listings',
'label' => 'Test First Name',
'is_searchable' => 1,
'is_active' => 1,
- );
- $baseFields[] = array(
+ ];
+ $baseFields[] = [
'field_name' => 'country',
'field_type' => 'Contact',
'visibility' => 'Public Pages and Listings',
'is_searchable' => 1,
'is_active' => 1,
'location_type_id' => 1,
- );
- $baseFields[] = array(
+ ];
+ $baseFields[] = [
'field_name' => 'phone',
'field_type' => 'Contact',
'visibility' => 'Public Pages and Listings',
'is_active' => 1,
'location_type_id' => 1,
'phone_type_id' => 1,
- );
+ ];
- $params = array(
+ $params = [
'uf_group_id' => $this->_ufGroupId,
'option.autoweight' => FALSE,
'values' => $baseFields,
'check_permissions' => TRUE,
- );
+ ];
$result = $this->callAPIAndDocument('uf_field', 'replace', $params, __FUNCTION__, __FILE__);
- $inputsByName = CRM_Utils_Array::index(array('field_name'), $params['values']);
+ $inputsByName = CRM_Utils_Array::index(['field_name'], $params['values']);
$this->assertEquals(count($params['values']), count($result['values']));
foreach ($result['values'] as $outUfField) {
$this->assertTrue(is_string($outUfField['field_name']));
*/
public function testProfilesWithoutACL() {
$this->createLoggedInUser();
- $baseFields[] = array(
+ $baseFields[] = [
'field_name' => 'first_name',
'field_type' => 'Contact',
'visibility' => 'Public Pages and Listings',
'label' => 'Test First Name',
'is_searchable' => 1,
'is_active' => 1,
- );
- CRM_Core_Config::singleton()->userPermissionClass->permissions = array('access CiviCRM');
- $params = array(
+ ];
+ CRM_Core_Config::singleton()->userPermissionClass->permissions = ['access CiviCRM'];
+ $params = [
'uf_group_id' => $this->_ufGroupId,
'option.autoweight' => FALSE,
'values' => $baseFields,
'check_permissions' => TRUE,
- );
+ ];
$this->_loggedInUser = CRM_Core_Session::singleton()->get('userID');
$this->callAPIFailure('uf_field', 'replace', $params);
}
*/
public function testACLPermissionforProfiles() {
$this->createLoggedInUser();
- $this->_permissionedGroup = $this->groupCreate(array(
+ $this->_permissionedGroup = $this->groupCreate([
'title' => 'Edit Profiles',
'is_active' => 1,
'name' => 'edit-profiles',
- ));
+ ]);
$this->setupACL(TRUE);
$this->testReplaceUFFields();
}
protected $_ufGroupId = 11;
protected $_ufFieldId;
protected $_contactId = 69;
- protected $_apiversion;
protected function setUp() {
parent::setUp();
'civicrm_uf_match',
)
);
- $this->_apiversion = 3;
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute(
- $this->_dbconn,
- $this->createFlatXMLDataSet(dirname(__FILE__) . '/dataset/uf_group_test.xml')
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/dataset/uf_group_test.xml');
}
public function tearDown() {
protected $_ufGroupId = 11;
protected $_ufFieldId;
protected $_contactId;
- protected $_apiversion;
protected $_params = array();
protected function setUp() {
parent::setUp();
- $this->_apiversion = 3;
$this->quickCleanup(
array(
'civicrm_group',
)
);
$this->_contactId = $this->individualCreate();
- $op = new PHPUnit_Extensions_Database_Operation_Insert();
- $op->execute(
- $this->_dbconn,
- $this->createFlatXMLDataSet(dirname(__FILE__) . '/dataset/uf_group_test.xml')
- );
+ $this->loadXMLDataSet(dirname(__FILE__) . '/dataset/uf_group_test.xml');
$this->_params = array(
'contact_id' => $this->_contactId,
/**
* Should CiviCRM log any modifications to this table in the civicrm_log table.
*
- * @var boolean
+ * @var bool
*/
protected static $_log = FALSE;
/**
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!-- $Id: email_contact_17.xml 30511 2010-11-03 11:36:36Z shot $ -->
-<dataset>
- <table name="civicrm_email">
- <column>id</column>
- <column>contact_id</column>
- <column>location_type_id</column>
- <column>email</column>
- <column>is_primary</column>
- <column>is_billing</column>
- <column>on_hold</column>
- <column>is_bulkmail</column>
- <column>hold_date</column>
- <column>reset_date</column>
- <row>
- <value>100</value> <!-- id -->
- <value>17</value> <!-- contact_id -->
- <value>1</value> <!-- location_type_id -->
- <value>TestContact@example.com</value> <!-- email -->
- <value>1</value> <!-- is_primary -->
- <value>1</value> <!-- is_billing -->
- <value>0</value> <!-- on_hold -->
- <value>0</value> <!-- is_bulkmail -->
- <null /> <!-- hold_date -->
- <null /> <!-- reset_date -->
- </row>
- </table>
-</dataset>
*/
-
-require_once ('bin/cli.php');
+require_once('bin/cli.php');
require_once 'CRM/Core/BAO/Tag.php';
/**
die("you need to profide a csv file (1st column parent name, 2nd tag name");
}
$this->file = $this->args[0];
- $this->tags = array_flip(CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', array('onlyActive' => FALSE)));
+ $this->tags = array_flip(CRM_Core_PseudoConstant::get('CRM_Core_DAO_EntityTag', 'tag_id', ['onlyActive' => FALSE]));
}
//format expected: parent name, tag
echo "\n- exists already: " . $param['name'];
return;
}
- $key = array('tag' => '');
+ $key = ['tag' => ''];
if ($param['parent']) {
if (array_key_exists($param['parent'], $this->tags)) {
$param['parent_id'] = $this->tags[$param['parent']];
}
- else $param['parent_id'] = $this->addTag(array(parent => '', name => $param['parent']));
+ else {
+ $param['parent_id'] = $this->addTag([
+ parent => '',
+ name => $param['parent'],
+ ]);
+ }
$tag = CRM_Core_BAO_Tag::add($param, $key);
echo "\n" . $tag->id . ": create " . $param['name'] . " below " . $param['parent'];
}
require_once 'Console/Getopt.php';
$shortOptions = "n:p:k:pre";
- $longOptions = array('name=', 'pass=', 'key=', 'prefix=');
+ $longOptions = ['name=', 'pass=', 'key=', 'prefix='];
$getopt = new Console_Getopt();
$args = $getopt->readPHPArgv();
array_shift($args);
list($valid, $dontCare) = $getopt->getopt2($args, $shortOptions, $longOptions);
- $vars = array(
+ $vars = [
'name' => 'n',
'pass' => 'p',
'key' => 'k',
'prefix' => 'pre',
- );
+ ];
foreach ($vars as $var => $short) {
$$var = NULL;
$dao = &CRM_Core_DAO::executeQuery($query);
$updateQuery = "UPDATE civicrm_phone SET phone = %1 where id = %2";
- $params = array(1 => array('', 'String'),
- 2 => array(0, 'Integer'),
- );
+ $params = [
+ 1 => ['', 'String'],
+ 2 => [0, 'Integer'],
+ ];
$totalPhone = $validPhone = $nonPrefixedPhone = 0;
while ($dao->fetch()) {
$newPhone = processPhone($dao->phone, $prefix);
* Scrape all config options from the CKEditor documentation site.
*/
$content = file_get_contents('http://docs.ckeditor.com/?print=/api/CKEDITOR.config');
-$matches = $output = array();
+$matches = $output = [];
preg_match_all("#name expandable'>([^<]+)</a>\s?:\s?(.*)<span.*'short'>([\s\S]*?)</div>#", $content, $matches);
foreach ($matches[1] as $i => $name) {
- $output[] = array(
+ $output[] = [
'id' => $name,
'type' => strip_tags($matches[2][$i]),
- 'description' => str_replace(array("\n", '. ...'), array(' ', '.'), $matches[3][$i]),
- );
+ 'description' => str_replace(["\n", '. ...'], [' ', '.'], $matches[3][$i]),
+ ];
}
if ($output) {
$location = str_replace('tools/bin/scripts', '', __DIR__);
/**
* A PHP shell script
-
- On drupal if you have a symlink to your civi module, don't forget to create a new file - settings_location.php
- Enter the following code (substitute the actual location of your <drupal root>/sites directory)
- <?php
- define( 'CIVICRM_CONFDIR', '/var/www/drupal.6/sites' );
- ?>
-
+ *
+ * On drupal if you have a symlink to your civi module, don't forget to create a new file - settings_location.php
+ * Enter the following code (substitute the actual location of your <drupal root>/sites directory)
+ * <?php
+ * define( 'CIVICRM_CONFDIR', '/var/www/drupal.6/sites' );
+ * ?>
*/
$include_path = "../packages/:" . get_include_path();
set_include_path($include_path);
// set_include_path( $include_path );
require_once 'Console/Getopt.php';
$shortOptions = "s:u:p:k:";
- $longOptions = array('site=', 'user', 'pass');
+ $longOptions = ['site=', 'user', 'pass'];
$getopt = new Console_Getopt();
$args = $getopt->readPHPArgv();
array_shift($args);
list($valid, $this->args) = $getopt->getopt2($args, $shortOptions, $longOptions);
- $vars = array(
+ $vars = [
'user' => 'u',
'pass' => 'p',
'key' => 'k',
'site' => 's',
- );
+ ];
foreach ($vars as $var => $short) {
$$var = NULL;
function authenticate($user, $pass) {
session_start();
require_once 'CRM/Core/Config.php';
-
- $config = &CRM_Core_Config::singleton();
+ // Does calling this do anything here?
+ CRM_Core_Config::singleton();
// this does not return on failure
// require_once 'CRM/Utils/System.php';
$_SERVER['PHP_SELF'] = "/index.php";
$_SERVER['HTTP_HOST'] = $this->site;
$_REQUEST['key'] = $this->key;
- require_once ("./civicrm.config.php");
+ require_once("./civicrm.config.php");
}
}
define('CIVICRM_USE_MEMCACHE', 1);
-$config = &CRM_Core_Config::singleton();
-$cache = &CRM_Utils_Cache::singleton();
+$config = CRM_Core_Config::singleton();
+$cache = CRM_Utils_Cache::singleton();
-$cache->set('CRM_Core_Config' .CRM_Core_Config::domainID(), $config);
+$cache->set('CRM_Core_Config' . CRM_Core_Config::domainID(), $config);
CRM_Core_Error::debug('get', $cache->get('CRM_Core_Config' . CRM_Core_Config::domainID()));
echo "Changing version from $oldVersion to $newVersion...\n";
$verName = makeVerName($newVersion);
-$phpFile = initFile("CRM/Upgrade/Incremental/php/{$verName}.php", function() use ($verName) {
+$phpFile = initFile("CRM/Upgrade/Incremental/php/{$verName}.php", function () use ($verName) {
ob_start();
global $camelNumber;
$camelNumber = $verName;
return ob_get_clean();
});
-$sqlFile = initFile("CRM/Upgrade/Incremental/sql/{$newVersion}.mysql.tpl", function() use ($newVersion) {
+$sqlFile = initFile("CRM/Upgrade/Incremental/sql/{$newVersion}.mysql.tpl", function () use ($newVersion) {
return "{* file to handle db changes in $newVersion during upgrade *}\n";
});
<?php
-require_once '../civicrm.config.php'; require_once 'CRM/Core/Config.php';
+require_once '../civicrm.config.php';
+require_once 'CRM/Core/Config.php';
require_once 'CRM/Core/Error.php';
$config = CRM_Core_Config::singleton();
exit();
$xmlProcessor->run(104, 1, 'Substance Abuse', '15 Day Review');
-$params = array('clientID' => 104,
+$params = [
+ 'clientID' => 104,
'creatorID' => 108,
'standardTimeline' => 1,
'activityTypeName' => 'Open Case',
'dueDateTime' => time(),
'caseID' => 1,
-);
+];
require_once 'CRM/Case/XMLProcessor/Process.php';
$xmlProcessor = new CRM_Case_XMLProcessor_Process();
*/
-
/*
* This script recaches the display_name and sort_name values
*
function __construct() {
// you can run this program either from an apache command, or from the cli
if (php_sapi_name() == "cli") {
- require_once ("cli.php");
+ require_once("cli.php");
$cli = new civicrm_cli();
//if it doesn't die, it's authenticated
}
$prefixes = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'prefix_id');
$suffixes = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'suffix_id');
- $tokens = array();
+ $tokens = [];
CRM_Utils_Hook::tokens($tokens);
- $tokenFields = array();
+ $tokenFields = [];
foreach ($tokens as $category => $catTokens) {
foreach ($catTokens as $token) {
$tokenFields[] = $token;
while ($dao->fetch()) {
$contactID = $dao->id;
- $params = array('first_name' => $dao->first_name,
+ $params = [
+ 'first_name' => $dao->first_name,
'middle_name' => $dao->middle_name,
'last_name' => $dao->last_name,
'prefix_id' => $dao->prefix_id,
'suffix_id' => $dao->suffix_id,
- );
+ ];
$params['individual_prefix'] = $prefixes[$dao->prefix_id];
$params['individual_suffix'] = $suffixes[$dao->suffix_id];
* Implementation of hook_enable
*/
function civicrm_webtest_enable() {
- user_role_grant_permissions(1, array(
+ user_role_grant_permissions(1, [
'access CiviMail subscribe/unsubscribe pages',
'access all custom data',
'access uploaded files',
'profile create',
'profile view',
'register for events',
- ));
+ ]);
$roles = user_roles();
if (!in_array('civicrm_webtest_user', $roles)) {
$role->name = 'civicrm_webtest_user';
user_role_save($role);
$rid = $role->rid;
- } else {
+ }
+ else {
$rid = array_search('civicrm_webtest_user', $roles);
}
- user_role_grant_permissions($rid, array(
+ user_role_grant_permissions($rid, [
// FIXME: whoa, why do we bother with users if both need admin rights?
- 'access AJAX API',
+ 'access AJAX API',
// 'access all cases and activities',
- 'access all custom data',
- 'access CiviContribute',
- 'access CiviCRM',
- 'access CiviEvent',
- // 'access CiviGrant',
- 'access CiviMail',
- 'access CiviMail subscribe/unsubscribe pages',
- 'access CiviMember',
- 'access CiviPledge',
- 'access CiviReport',
- 'access Contact Dashboard',
- 'access contact reference fields',
- 'access deleted contacts',
- // 'access my cases and activities',
- 'access Report Criteria',
- 'save Report Criteria',
- 'access uploaded files',
- // 'add cases',
- 'add contacts',
- // 'administer CiviCase',
- 'administer CiviCRM',
- 'administer dedupe rules',
- 'administer Reports',
- 'administer reserved groups',
- 'administer reserved reports',
- 'administer reserved tags',
- 'administer Tagsets',
- 'delete activities',
- 'delete contacts',
- // 'delete in CiviCase',
- 'delete in CiviContribute',
- 'delete in CiviEvent',
- // 'delete in CiviGrant',
- 'delete in CiviMail',
- 'delete in CiviMember',
- 'delete in CiviPledge',
- 'edit all contacts',
- 'view my contact',
- 'edit my contact',
- 'edit all events',
- 'edit contributions',
- 'edit event participants',
- 'edit message templates',
- // 'edit grants',
- 'edit groups',
- 'edit memberships',
- 'edit pledges',
- 'import contacts',
- 'make online contributions',
- 'manage tags',
- 'merge duplicate contacts',
- 'profile create',
- 'profile edit',
- 'profile listings',
- 'profile listings and forms',
- 'profile view',
- 'register for events',
- 'translate CiviCRM',
- 'view all activities',
- 'view all contacts',
- 'view all notes',
- 'view event info',
- 'view event participants',
- 'view public CiviMail content',
- 'administer payment processors',
- 'create manual batch',
- 'edit own manual batches',
- 'edit all manual batches',
- 'view own manual batches',
- 'view all manual batches',
- 'delete own manual batches',
- 'delete all manual batches',
- 'export own manual batches',
- 'export all manual batches',
- ));
+ 'access all custom data',
+ 'access CiviContribute',
+ 'access CiviCRM',
+ 'access CiviEvent',
+ // 'access CiviGrant',
+ 'access CiviMail',
+ 'access CiviMail subscribe/unsubscribe pages',
+ 'access CiviMember',
+ 'access CiviPledge',
+ 'access CiviReport',
+ 'access Contact Dashboard',
+ 'access contact reference fields',
+ 'access deleted contacts',
+ // 'access my cases and activities',
+ 'access Report Criteria',
+ 'save Report Criteria',
+ 'access uploaded files',
+ // 'add cases',
+ 'add contacts',
+ // 'administer CiviCase',
+ 'administer CiviCRM',
+ 'administer dedupe rules',
+ 'administer Reports',
+ 'administer reserved groups',
+ 'administer reserved reports',
+ 'administer reserved tags',
+ 'administer Tagsets',
+ 'delete activities',
+ 'delete contacts',
+ // 'delete in CiviCase',
+ 'delete in CiviContribute',
+ 'delete in CiviEvent',
+ // 'delete in CiviGrant',
+ 'delete in CiviMail',
+ 'delete in CiviMember',
+ 'delete in CiviPledge',
+ 'edit all contacts',
+ 'view my contact',
+ 'edit my contact',
+ 'edit all events',
+ 'edit contributions',
+ 'edit event participants',
+ 'edit message templates',
+ // 'edit grants',
+ 'edit groups',
+ 'edit memberships',
+ 'edit pledges',
+ 'import contacts',
+ 'make online contributions',
+ 'manage tags',
+ 'merge duplicate contacts',
+ 'profile create',
+ 'profile edit',
+ 'profile listings',
+ 'profile listings and forms',
+ 'profile view',
+ 'register for events',
+ 'translate CiviCRM',
+ 'view all activities',
+ 'view all contacts',
+ 'view all notes',
+ 'view event info',
+ 'view event participants',
+ 'view public CiviMail content',
+ 'administer payment processors',
+ 'create manual batch',
+ 'edit own manual batches',
+ 'edit all manual batches',
+ 'view own manual batches',
+ 'view all manual batches',
+ 'delete own manual batches',
+ 'delete all manual batches',
+ 'export own manual batches',
+ 'export all manual batches',
+ ]);
}
*/
function _angularex_civix_civicrm_config(&$config = NULL) {
static $configured = FALSE;
- if ($configured) return;
+ if ($configured) {
+ return;
+ }
$configured = TRUE;
$template =& CRM_Core_Smarty::singleton();
- $extRoot = dirname( __FILE__ ) . DIRECTORY_SEPARATOR;
+ $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
$extDir = $extRoot . 'templates';
- if ( is_array( $template->template_dir ) ) {
- array_unshift( $template->template_dir, $extDir );
- } else {
- $template->template_dir = array( $extDir, $template->template_dir );
+ if (is_array($template->template_dir)) {
+ array_unshift($template->template_dir, $extDir);
+ }
+ else {
+ $template->template_dir = [$extDir, $template->template_dir];
}
- $include_path = $extRoot . PATH_SEPARATOR . get_include_path( );
- set_include_path( $include_path );
+ $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+ set_include_path($include_path);
}
/**
function _angularex_civix_civicrm_enable() {
_angularex_civix_civicrm_config();
if ($upgrader = _angularex_civix_upgrader()) {
- if (is_callable(array($upgrader, 'onEnable'))) {
+ if (is_callable([$upgrader, 'onEnable'])) {
return $upgrader->onEnable();
}
}
function _angularex_civix_civicrm_disable() {
_angularex_civix_civicrm_config();
if ($upgrader = _angularex_civix_upgrader()) {
- if (is_callable(array($upgrader, 'onDisable'))) {
+ if (is_callable([$upgrader, 'onDisable'])) {
return $upgrader->onDisable();
}
}
* @return CRM_Angularex_Upgrader
*/
function _angularex_civix_upgrader() {
- if (!file_exists(__DIR__.'/CRM/Angularex/Upgrader.php')) {
+ if (!file_exists(__DIR__ . '/CRM/Angularex/Upgrader.php')) {
return NULL;
- } else {
+ }
+ else {
return CRM_Angularex_Upgrader_Base::instance();
}
}
* @return array(string)
*/
function _angularex_civix_find_files($dir, $pattern) {
- if (is_callable(array('CRM_Utils_File', 'findFiles'))) {
+ if (is_callable(['CRM_Utils_File', 'findFiles'])) {
return CRM_Utils_File::findFiles($dir, $pattern);
}
- $todos = array($dir);
- $result = array();
+ $todos = [$dir];
+ $result = [];
while (!empty($todos)) {
$subdir = array_shift($todos);
foreach (_angularex_civix_glob("$subdir/$pattern") as $match) {
while (FALSE !== ($entry = readdir($dh))) {
$path = $subdir . DIRECTORY_SEPARATOR . $entry;
if ($entry{0} == '.') {
- } elseif (is_dir($path)) {
+ }
+ elseif (is_dir($path)) {
$todos[] = $path;
}
}
CRM_Core_Error::fatal($errorMessage);
// throw new CRM_Core_Exception($errorMessage);
}
- $caseTypes[$name] = array(
+ $caseTypes[$name] = [
'module' => 'org.civicrm.angularex',
'name' => $name,
'file' => $file,
- );
+ ];
}
}
*/
function _angularex_civix_glob($pattern) {
$result = glob($pattern);
- return is_array($result) ? $result : array();
+ return is_array($result) ? $result : [];
}
/**
// If we are done going down the path, insert menu
if (empty($path)) {
- if (!$navId) $navId = CRM_Core_DAO::singleValueQuery("SELECT max(id) FROM civicrm_navigation");
- $navId ++;
- $menu[$navId] = array (
- 'attributes' => array_merge($item, array(
- 'label' => CRM_Utils_Array::value('name', $item),
- 'active' => 1,
- 'parentID' => $parentId,
- 'navID' => $navId,
- ))
- );
- return true;
- } else {
+ if (!$navId) {
+ $navId = CRM_Core_DAO::singleValueQuery("SELECT max(id) FROM civicrm_navigation");
+ }
+ $navId++;
+ $menu[$navId] = [
+ 'attributes' => array_merge($item, [
+ 'label' => CRM_Utils_Array::value('name', $item),
+ 'active' => 1,
+ 'parentID' => $parentId,
+ 'navID' => $navId,
+ ]),
+ ];
+ return TRUE;
+ }
+ else {
// Find an recurse into the next level down
- $found = false;
+ $found = FALSE;
$path = explode('/', $path);
$first = array_shift($path);
foreach ($menu as $key => &$entry) {
if ($entry['attributes']['name'] == $first) {
- if (!$entry['child']) $entry['child'] = array();
+ if (!$entry['child']) {
+ $entry['child'] = [];
+ }
$found = _angularex_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item, $key);
}
}
*/
function _angularex_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
static $configured = FALSE;
- if ($configured) return;
+ if ($configured) {
+ return;
+ }
$configured = TRUE;
$settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
- if(is_dir($settingsDir) && !in_array($settingsDir, $metaDataFolders)) {
+ if (is_dir($settingsDir) && !in_array($settingsDir, $metaDataFolders)) {
$metaDataFolders[] = $settingsDir;
}
}
* @param $angularModule
*/
function angularex_civicrm_angularModules(&$angularModule) {
- $angularModule['example'] = array(
+ $angularModule['example'] = [
'ext' => 'org.civicrm.angularex',
- 'js' => array('js/*.js'),
- 'partials' => array('partials'),
- );
+ 'js' => ['js/*.js'],
+ 'partials' => ['partials'],
+ ];
}
const QUEUE_NAME = 'demo-queue';
function run() {
- $queue = CRM_Queue_Service::singleton()->create(array(
+ $queue = CRM_Queue_Service::singleton()->create([
'type' => 'Sql',
'name' => self::QUEUE_NAME,
'reset' => TRUE,
- ));
+ ]);
for ($i = 0; $i < 5; $i++) {
$queue->createItem(new CRM_Queue_Task(
- array('CRM_Demoqueue_Page_DemoQueue', 'doMyWork'), // callback
- array($i, "Task $i takes $i second(s)"), // arguments
+ ['CRM_Demoqueue_Page_DemoQueue', 'doMyWork'], // callback
+ [$i, "Task $i takes $i second(s)"], // arguments
"Task $i" // title
));
if ($i == 2) {
$queue->createItem(new CRM_Queue_Task(
- array('CRM_Demoqueue_Page_DemoQueue', 'addMoreWork'), // callback
- array(), // arguments
+ ['CRM_Demoqueue_Page_DemoQueue', 'addMoreWork'], // callback
+ [], // arguments
"Add More Work" // title
));
}
}
- $runner = new CRM_Queue_Runner(array(
+ $runner = new CRM_Queue_Runner([
'title' => ts('Demo Queue Runner'),
'queue' => $queue,
- 'onEnd' => array('CRM_Demoqueue_Page_DemoQueue', 'onEnd'),
+ 'onEnd' => ['CRM_Demoqueue_Page_DemoQueue', 'onEnd'],
'onEndUrl' => CRM_Utils_System::url('civicrm/demo-queue/done'),
- ));
+ ]);
$runner->runAllViaWeb(); // does not return
}
sleep(1);
for ($i = 0; $i < 5; $i++) {
$ctx->queue->createItem(new CRM_Queue_Task(
- array('CRM_Demoqueue_Page_DemoQueue', 'doMyWork'), // callback
- array($i, "Extra task $i takes $i second(s)"), // arguments
+ ['CRM_Demoqueue_Page_DemoQueue', 'doMyWork'], // callback
+ [$i, "Extra task $i takes $i second(s)"], // arguments
"Extra Task $i" // title
- ), array(
+ ), [
'weight' => -1,
- ));
+ ]);
}
return TRUE; // success
}
* Class CRM_Demoqueue_Page_DemoQueueDone
*/
class CRM_Demoqueue_Page_DemoQueueDone extends CRM_Core_Page {
- function run() {
- // Example: Set the page-title dynamically; alternatively, declare a static title in xml/Menu/*.xml
- CRM_Utils_System::setTitle(ts('DemoQueueDone'));
- parent::run();
- }
+ function run() {
+ // Example: Set the page-title dynamically; alternatively, declare a static title in xml/Menu/*.xml
+ CRM_Utils_System::setTitle(ts('DemoQueueDone'));
+ parent::run();
+ }
}
function _demoqueue_civix_civicrm_config(&$config) {
$template =& CRM_Core_Smarty::singleton();
- $extRoot = dirname( __FILE__ ) . DIRECTORY_SEPARATOR;
+ $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
$extDir = $extRoot . 'templates';
- if ( is_array( $template->template_dir ) ) {
- array_unshift( $template->template_dir, $extDir );
- } else {
- $template->template_dir = array( $extDir, $template->template_dir );
+ if (is_array($template->template_dir)) {
+ array_unshift($template->template_dir, $extDir);
+ }
+ else {
+ $template->template_dir = [$extDir, $template->template_dir];
}
- $include_path = $extRoot . PATH_SEPARATOR . get_include_path( );
- set_include_path( $include_path );
+ $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+ set_include_path($include_path);
}
/**
global $civicrm_root;
$realArgs = $argv;
$diffCmd = FALSE;
-$files = array();
+$files = [];
array_shift($realArgs);
foreach ($realArgs as $arg) {
echo "File \"$file\" appears to have consistency issues. Created $newFile.\n";
file_put_contents($newFile, $newMarkup);
if ($diffCmd) {
- passthru($diffCmd . ' ' . escapeshellarg($file) . ' ' . escapeshellarg($newFile));
+ passthru($diffCmd . ' ' . escapeshellarg($file) . ' ' . escapeshellarg($newFile));
}
}
-}
\ No newline at end of file
+}
<?php
-$options = getopt('bc:ht:'); if (isset($options['h'])) {
+$options = getopt('bc:ht:');
+if (isset($options['h'])) {
print ("\nUsage: php civimail-spooler.php [-bh] [-c <config>] [-t <period>]\n");
print (" -b Run this process continuously\n");
print (" -c Path to CiviCRM civicrm.settings.php\n");
require_once "CRM/Core/Config.php";
');
-$config = &CRM_Core_Config::singleton();
+$config = CRM_Core_Config::singleton();
/* Temporary permissioning hack for now */
* process into the background and provide init.d scripts */
-
CRM_Mailing_BAO_MailingJob::runJobs();
sleep($config->mailerPeriod);
}
/**
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version //autogentag//
+diff --git a/src/parser/interfaces/part_parser.php b/src/parser/interfaces/part_parser.php
+index a81378b..6c59e5a 100644
+--- a/src/parser/interfaces/part_parser.php
++++ b/src/parser/interfaces/part_parser.php
+@@ -168,7 +168,11 @@ abstract class ezcMailPartParser
+ break;
+
+ case 'text':
+- if ( ezcMailPartParser::$parseTextAttachmentsAsFiles === true )
++ // dev/core#940 Ensure that emails are not processed as .unknown attachments by checking
++ // for Filename or name in the content-disposition and content-type headers.
++ if ( (ezcMailPartParser::$parseTextAttachmentsAsFiles === true) &&
++ (preg_match('/\s*filename="?([^;"]*);?/i', $headers['Content-Disposition']) ||
++ preg_match( '/\s*name="?([^;"]*);?/i' , $headers['Content-Type']) ) )
+ {
+ $bodyParser = new ezcMailFileParser( $mainType, $subType, $headers );
+ }
function &splitContactIDs(&$contactIDs) {
// contactIDs could be a real large array, so we split it up into
// smaller chunks and then general xml for each chunk
- $chunks = array();
- $current = 0;
- $chunks[$current] = array();
- $count = 0;
+ $chunks = [];
+ $current = 0;
+ $chunks[$current] = [];
+ $count = 0;
foreach ($contactIDs as $cid) {
$chunks[$current][] = $cid;
if ($count == CHUNK_SIZE) {
$current++;
- $chunks[$current] = array();
+ $chunks[$current] = [];
$count = 0;
}
}
foreach ($tokens as $n => $v) {
if (is_array($v)) {
- $str = array();
+ $str = [];
foreach ($v as $el) {
$el = escapeJsonString($el);
$str[] = "\"$el\"";
* @return mixed
*/
function escapeJsonString($value) {
- $escapers = array("\\", "/", "\"", "\n", "\r", "\t", "\x08", "\x0c");
- $replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b");
+ $escapers = ["\\", "/", "\"", "\n", "\r", "\t", "\x08", "\x0c"];
+ $replacements = ["\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b"];
return str_replace($escapers, $replacements, $value);
}
* @return array
*/
function getValues(&$contactIDs, &$values) {
- $values = array();
+ $values = [];
foreach ($contactIDs as $cid) {
- $values[$cid] = array();
+ $values[$cid] = [];
}
getContactInfo($contactIDs, $values);
* @param $values
*/
function getContactInfo(&$contactIDs, &$values) {
- $fields = array('sort_name' => NULL,
+ $fields = [
+ 'sort_name' => NULL,
'display_name' => NULL,
'contact_type' => NULL,
'legal_identifier' => NULL,
'organization_name' => NULL,
'legal_name' => NULL,
'job_title' => NULL,
- );
+ ];
getTableInfo($contactIDs, $values, 'civicrm_contact', $fields, 'id');
}
WHERE c.id IN ( $ids )
";
- $fields = array('location_type', 'street_address', 'supplemental_address_1',
- 'supplemental_address_2', 'supplemental_address_3', 'city', 'postal_code',
- 'state', 'country',
- );
+ $fields = [
+ 'location_type',
+ 'street_address',
+ 'supplemental_address_1',
+ 'supplemental_address_2',
+ 'supplemental_address_3',
+ 'city',
+ 'postal_code',
+ 'state',
+ 'country',
+ ];
$dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
$address = '';
else {
if (!is_array($values[$contactID][$name])) {
$save = $values[$contactID][$name];
- $values[$contactID][$name] = array();
+ $values[$contactID][$name] = [];
$values[$contactID][$name][] = $save;
}
$values[$contactID][$name][] = $value;
$chunks = &splitContactIDs($contactIDs);
foreach ($chunks as $chunk) {
- $values = array();
+ $values = [];
getValues($chunk, $values);
$xml = &generateSolrJSON($values);
echo $xml;
}
}
-$config = &CRM_Core_Config::singleton();
+$config = CRM_Core_Config::singleton();
$config->userFramework = 'Soap';
$config->userFrameworkClass = 'CRM_Utils_System_Soap';
$config->userHookClass = 'CRM_Utils_Hook_Soap';
$dao = &CRM_Core_DAO::executeQuery($sql);
-$contactIDs = array();
+$contactIDs = [];
while ($dao->fetch()) {
$contactIDs[] = $dao->id;
}
function &splitContactIDs(&$contactIDs) {
// contactIDs could be a real large array, so we split it up into
// smaller chunks and then general xml for each chunk
- $chunks = array();
- $current = 0;
- $chunks[$current] = array();
- $count = 0;
+ $chunks = [];
+ $current = 0;
+ $chunks[$current] = [];
+ $count = 0;
foreach ($contactIDs as $cid) {
$chunks[$current][] = $cid;
if ($count == CHUNK_SIZE) {
$current++;
- $chunks[$current] = array();
+ $chunks[$current] = [];
$count = 0;
}
}
* @return array
*/
function getValues(&$contactIDs, &$values) {
- $values = array();
+ $values = [];
foreach ($contactIDs as $cid) {
- $values[$cid] = array();
+ $values[$cid] = [];
}
getContactInfo($contactIDs, $values);
if (!$name) {
$name = $fld;
}
- $values[$dao->contact_id][] = array($name, $dao->$fld);
+ $values[$dao->contact_id][] = [$name, $dao->$fld];
}
}
}
* @param $values
*/
function getContactInfo(&$contactIDs, &$values) {
- $fields = array('sort_name' => NULL,
+ $fields = [
+ 'sort_name' => NULL,
'display_name' => NULL,
'contact_type' => NULL,
'legal_identifier' => NULL,
'external_identifier' => NULL,
'source' => 'contact_source',
- );
+ ];
getTableInfo($contactIDs, $values, 'civicrm_contact', $fields, 'id');
- $fields = array('first_name' => NULL,
+ $fields = [
+ 'first_name' => NULL,
'last_name' => NULL,
'middle_name' => NULL,
'job_title' => NULL,
- );
+ ];
getTableInfo($contactIDs, $values, 'civicrm_individual', $fields, 'contact_id');
- $fields = array('household_name' => NULL);
+ $fields = ['household_name' => NULL];
getTableInfo($contactIDs, $values, 'civicrm_household', $fields, 'contact_id');
- $fields = array('organization_name' => NULL,
+ $fields = [
+ 'organization_name' => NULL,
'legal_name' => NULL,
'sic_code' => NULL,
- );
+ ];
getTableInfo($contactIDs, $values, 'civicrm_organization', $fields, 'contact_id');
- $fields = array('note' => 'note_body',
+ $fields = [
+ 'note' => 'note_body',
'subject' => 'note_subject',
- );
+ ];
getTableInfo($contactIDs, $values, 'civicrm_note', $fields, 'entity_id', "entity_table = 'civicrm_contact'");
}
AND l.entity_id IN ( $ids )
";
- $fields = array('location_name', 'street_address', 'supplemental_address_1',
- 'supplemental_address_2', 'supplemental_address_3', 'city', 'postal_code', 'county', 'state',
- 'country', 'email', 'phone', 'im',
- );
+ $fields = [
+ 'location_name',
+ 'street_address',
+ 'supplemental_address_1',
+ 'supplemental_address_2',
+ 'supplemental_address_3',
+ 'city',
+ 'postal_code',
+ 'county',
+ 'state',
+ 'country',
+ 'email',
+ 'phone',
+ 'im',
+ ];
$dao = CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
foreach ($fields as $fld) {
if (empty($dao->$fld)) {
continue;
}
- $values[$dao->contact_id][] = array($fld, $dao->$fld);
+ $values[$dao->contact_id][] = [$fld, $dao->$fld];
}
}
}
$chunks = &splitContactIDs($contactIDs);
foreach ($chunks as $chunk) {
- $values = array();
+ $values = [];
getValues($chunk, $values);
$xml = &generateSolrXML($values);
echo $xml;
}
}
-$config = &CRM_Core_Config::singleton();
+$config = CRM_Core_Config::singleton();
$config->userFramework = 'Soap';
$config->userFrameworkClass = 'CRM_Utils_System_Soap';
$config->userHookClass = 'CRM_Utils_Hook_Soap';
EOT;
$dao = CRM_Core_DAO::executeQuery($sql);
-$contactIDs = array();
+$contactIDs = [];
while ($dao->fetch()) {
$contactIDs[] = $dao->id;
}
function &splitContactIDs(&$contactIDs) {
// contactIDs could be a real large array, so we split it up into
// smaller chunks and then general xml for each chunk
- $chunks = array();
- $current = 0;
- $chunks[$current] = array();
- $count = 0;
+ $chunks = [];
+ $current = 0;
+ $chunks[$current] = [];
+ $count = 0;
foreach ($contactIDs as $k => $v) {
$chunks[$current][$k] = $v;
if ($count == CHUNK_SIZE) {
$current++;
- $chunks[$current] = array();
+ $chunks[$current] = [];
$count = 0;
}
}
* @return array
*/
function getValues(&$contactIDs, &$values, &$allContactIDs, &$addditionalContactIDs) {
- $values = array();
+ $values = [];
getContactInfo($contactIDs, $values);
getAddressInfo($contactIDs, $values);
* @param bool $flat
*/
function getTableInfo(&$contactIDs, &$values, $tableName, &$fields,
- $whereField, $additionalWhereCond = NULL,
- $flat = FALSE
+ $whereField, $additionalWhereCond = NULL,
+ $flat = FALSE
) {
$selectString = implode(',', array_keys($fields));
$idString = implode(',', $contactIDs);
$dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
- $contact = array();
+ $contact = [];
foreach ($fields as $fld => $name) {
$name = $name ? $name : $fld;
if (empty($dao->$fld)) {
* @param $values
*/
function getContactInfo(&$contactIDs, &$values) {
- $fields = array('id' => NULL,
+ $fields = [
+ 'id' => NULL,
'sort_name' => NULL,
'display_name' => NULL,
'contact_type' => NULL,
'organization_name' => NULL,
'legal_name' => NULL,
'job_title' => NULL,
- );
+ ];
getTableInfo($contactIDs, $values, 'civicrm_contact', $fields, 'id', NULL, TRUE);
}
$dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
- $note = array('id' => $dao->id,
+ $note = [
+ 'id' => $dao->id,
'contact_id' => $dao->contact_id,
'subject' => empty($dao->subject) ? NULL : $dao->subject,
'note' => empty($dao->note) ? NULL : $dao->note,
- );
+ ];
appendValue($values, $dao->id, 'note', $note);
}
$dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
- $phone = array('id' => $dao->id,
+ $phone = [
+ 'id' => $dao->id,
'contact_id' => $dao->contact_id,
'location_type' => empty($dao->location_type) ? NULL : $dao->location_type,
'phone' => $dao->phone,
'phone_type' => empty($dao->phone_type) ? NULL : $dao->phone_type,
- );
+ ];
appendValue($values, $dao->id, 'phone', $phone);
}
$dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
- $email = array('id' => $dao->id,
+ $email = [
+ 'id' => $dao->id,
'contact_id' => $dao->contact_id,
'location_type' => empty($dao->location_type) ? NULL : $dao->location_type,
'email' => $dao->email,
- );
+ ];
appendValue($values, $dao->id, 'email', $email);
}
$dao->free();
WHERE c.id IN ( $ids )
";
- $fields = array('id', 'contact_id',
- 'location_type', 'street_address', 'supplemental_address_1',
- 'supplemental_address_2', 'supplemental_address_3', 'city', 'postal_code',
- 'state', 'country',
- );
+ $fields = [
+ 'id',
+ 'contact_id',
+ 'location_type',
+ 'street_address',
+ 'supplemental_address_1',
+ 'supplemental_address_2',
+ 'supplemental_address_3',
+ 'city',
+ 'postal_code',
+ 'state',
+ 'country',
+ ];
$dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
- $address = array();
+ $address = [];
foreach ($fields as $fld) {
if (empty($dao->$fld)) {
$address[$fld] = NULL;
*/
function getRelationshipInfo(&$contactIDs, &$values, &$allContactIDs, &$additionalContacts) {
// handle relationships only once
- static $_relationshipsHandled = array();
+ static $_relationshipsHandled = [];
$ids = implode(',', $contactIDs);
";
$relationshipFields = getDBFields('CRM_Contact_DAO_Relationship');
- $fields = array_keys($relationshipFields);
- $dao = &CRM_Core_DAO::executeQuery($sql);
+ $fields = array_keys($relationshipFields);
+ $dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
if (isset($_relationshipsHandled[$dao->id])) {
continue;
}
$_relationshipsHandled[$dao->id] = $dao->id;
- $relationship = array();
+ $relationship = [];
foreach ($fields as $fld) {
if (empty($dao->$fld)) {
$relationship[$fld] = NULL;
}
appendValue($values, $dao->id, 'relationship', $relationship);
- addAdditionalContacts(array($dao->contact_id_a,
- $dao->contact_id_b,
- ),
+ addAdditionalContacts([
+ $dao->contact_id_a,
+ $dao->contact_id_b,
+ ],
$allContactIDs, $additionalContacts
);
}
* @param $additionalContacts
*/
function getActivityInfo(&$contactIDs, &$values, &$allContactIDs, &$additionalContacts) {
- static $_activitiesHandled = array();
+ static $_activitiesHandled = [];
$ids = implode(',', $contactIDs);
$activityFields = &getDBFields('CRM_Activity_DAO_Activity');
$fields = array_keys($activityFields);
- $activityIDs = array();
+ $activityIDs = [];
$dao = &CRM_Core_DAO::executeQuery($sql);
while ($dao->fetch()) {
if (isset($_activitiesHandled[$dao->id])) {
$_activitiesHandled[$dao->id] = $dao->id;
$activityIDs[] = $dao->id;
- $activity = array();
+ $activity = [];
foreach ($fields as $fld) {
if (empty($dao->$fld)) {
$activity[$fld] = NULL;
}
appendValue($values, $dao->id, 'activity', $activity);
- addAdditionalContacts(array($dao->source_contact_id),
+ addAdditionalContacts([$dao->source_contact_id],
$allContactIDs, $additionalContacts
);
}
$activityIDString = implode(",", $activityIDs);
// now get all assignee contact ids and target contact ids for this activity
- $sql = "SELECT * FROM civicrm_activity_assignment WHERE activity_id IN ($activityIDString)";
- $aaDAO = &CRM_Core_DAO::executeQuery($sql);
- $activityContacts = array();
+ $sql = "SELECT * FROM civicrm_activity_assignment WHERE activity_id IN ($activityIDString)";
+ $aaDAO = &CRM_Core_DAO::executeQuery($sql);
+ $activityContacts = [];
while ($aaDAO->fetch()) {
- $activityAssignee = array('id' => $aaDAO->id,
+ $activityAssignee = [
+ 'id' => $aaDAO->id,
'assignee_contact_id' => $aaDAO->assignee_contact_id,
'activity_id' => $aaDAO->activity_id,
- );
+ ];
appendValue($values, $aaDAO->id, 'activity_assignment', $activityAssignee);
$activityContacts[] = $aaDAO->assignee_contact_id;
}
$sql = "SELECT * FROM civicrm_activity_target WHERE activity_id IN ($activityIDString)";
$atDAO = &CRM_Core_DAO::executeQuery($sql);
while ($atDAO->fetch()) {
- $activityTarget = array('id' => $atDAO->id,
+ $activityTarget = [
+ 'id' => $atDAO->id,
'target_contact_id' => $atDAO->target_contact_id,
'activity_id' => $atDAO->activity_id,
- );
+ ];
appendValue($values, $atDAO->id, 'activity_target', $activityTarget);
$activityContacts[] = $atDAO->target_contact_id;
}
}
if (!isset($values[$name])) {
- $values[$name] = array();
+ $values[$name] = [];
$values[$name][] = array_keys($value);
}
$values[$name][] = array_values($value);
* @return mixed
*/
function getDBFields($daoName) {
- static $_fieldsRetrieved = array();
+ static $_fieldsRetrieved = [];
if (!isset($_fieldsRetrieved[$daoName])) {
- $_fieldsRetrieved[$daoName] = array();
+ $_fieldsRetrieved[$daoName] = [];
$daoFile = str_replace('_',
- DIRECTORY_SEPARATOR,
- $daoName
- ) . '.php';
- include_once ($daoFile);
+ DIRECTORY_SEPARATOR,
+ $daoName
+ ) . '.php';
+ include_once($daoFile);
$daoFields = &$daoName::fields();
require_once 'CRM/Utils/Array.php';
foreach ($daoFields as $key => & $value) {
- $_fieldsRetrieved[$daoName][$value['name']] = array('uniqueName' => $key,
+ $_fieldsRetrieved[$daoName][$value['name']] = [
+ 'uniqueName' => $key,
'type' => $value['type'],
'title' => CRM_Utils_Array::value('title', $value, NULL),
- );
+ ];
}
}
return $_fieldsRetrieved[$daoName];
function run(&$values, &$contactIDs, &$allContactIDs) {
$chunks = &splitContactIDs($contactIDs);
- $additionalContactIDs = array();
+ $additionalContactIDs = [];
foreach ($chunks as $chunk) {
getValues($chunk, $values, $allContactIDs, $additionalContactIDs);
}
}
-$config = &CRM_Core_Config::singleton();
+$config = CRM_Core_Config::singleton();
$config->userFramework = 'Soap';
$config->userFrameworkClass = 'CRM_Utils_System_Soap';
$config->userHookClass = 'CRM_Utils_Hook_Soap';
$dao = &CRM_Core_DAO::executeQuery($sql);
-$contactIDs = array();
+$contactIDs = [];
while ($dao->fetch()) {
$contactIDs[$dao->id] = $dao->id;
}
-$values = array();
+$values = [];
run($values, $contactIDs, $contactIDs);
$json = json_encode($values);
// FIXME: Make this a proper app with unit-tests
-$civi_pkgs_dir = dirname( dirname( dirname( __FILE__ ) ) ) . DIRECTORY_SEPARATOR . 'packages';
+$civi_pkgs_dir = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'packages';
require_once $civi_pkgs_dir . DIRECTORY_SEPARATOR . 'simple_html_dom.php';
exit(main($argv));
$files = $argv;
array_shift($files); // skip program name
foreach ($files as $file) {
- check_tpl($file, function($code, $message) use ($file) {
+ check_tpl($file, function ($code, $message) use ($file) {
printf("[%s] %s\n", $file, $message);
});
}
<import>true</import>
<headerPattern>/legal\s?id/i</headerPattern>
<dataPattern>/\w+?\d{5,}/</dataPattern>
- <comment>May be used for SSN, EIN/TIN, Household ID (census) or other applicable unique legal/government ID.
- </comment>
+ <comment>May be used for SSN, EIN/TIN, Household ID (census) or other applicable unique legal/government ID.</comment>
<add>1.1</add>
<html>
<type>Text</type>
<length>32</length>
<comment>API Key for validating requests related to this contact.</comment>
<add>2.2</add>
+ <protected>true</protected>
</field>
<index>
<name>index_api_key</name>
<localizable>true</localizable>
<comment>Name of Group.</comment>
<add>1.1</add>
+ <html>
+ <type>Text</type>
+ </html>
</field>
<field>
<name>description</name>
<title>Contact Subtype A</title>
<type>varchar</type>
<length>64</length>
- <comment>If defined, contact_sub_type_a in a relationship of this type must be a specific contact_sub_type.
- </comment>
+ <comment>If defined, contact_sub_type_a in a relationship of this type must be a specific contact_sub_type.</comment>
<add>3.1</add>
<html>
<type>Select</type>
<title>Contact Subtype B</title>
<type>varchar</type>
<length>64</length>
- <comment>If defined, contact_sub_type_b in a relationship of this type must be a specific contact_sub_type.
- </comment>
+ <comment>If defined, contact_sub_type_b in a relationship of this type must be a specific contact_sub_type.</comment>
<add>3.1</add>
<html>
<type>Select</type>
<title>Relationship Type is Active</title>
<type>boolean</type>
<default>1</default>
- <comment>Is this relationship type currently active (i.e. can be used when creating or editing relationships)?
- </comment>
+ <comment>Is this relationship type currently active (i.e. can be used when creating or editing relationships)?</comment>
<html>
<type>CheckBox</type>
</html>
<log>true</log>
<field>
<name>id</name>
+ <uniqueName>contribution_recur_id</uniqueName>
<title>Recurring Contribution ID</title>
<type>int unsigned</type>
<required>true</required>
</field>
<field>
<name>processor_id</name>
+ <uniqueName>contribution_recur_processor_id</uniqueName>
<title>Processor ID</title>
<type>varchar</type>
<length>255</length>
</foreignKey>
<field>
<name>trxn_id</name>
+ <uniqueName>contribution_recur_trxn_id</uniqueName>
<title>Transaction ID</title>
<type>varchar</type>
<length>255</length>
</index>
<field>
<name>contribution_status_id</name>
+ <uniqueName>contribution_recur_contribution_status_id</uniqueName>
<title>Status</title>
<type>int unsigned</type>
<default>1</default>
<field>
<name>payment_processor_id</name>
<title>Payment Processor</title>
+ <uniqueName>contribution_recur_payment_processor_id</uniqueName>
<type>int unsigned</type>
<comment>Foreign key to civicrm_payment_processor.id</comment>
<add>3.3</add>
<dataPattern>/^(\d{1,5}( [0-9A-Za-z]+)+)$|^(P\.?O\.\? Box \d{1,5})$/i</dataPattern>
<comment>Concatenation of all routable street address components (prefix, street number, street name, suffix, unit
number OR P.O. Box). Apps should be able to determine physical location with this data (for mapping, mail
- delivery, etc.).
- </comment>
+ delivery, etc.).</comment>
<add>1.1</add>
<html>
<type>Text</type>
<type>varchar</type>
<length>8</length>
<export>true</export>
- <comment>Non-numeric portion of address number on the street, e.g. For 112A Main St, the street_number_suffix = A
- </comment>
+ <comment>Non-numeric portion of address number on the street, e.g. For 112A Main St, the street_number_suffix = A</comment>
<add>1.1</add>
<html>
<type>Text</type>
<title>Namespace reserved for component.</title>
<type>varchar</type>
<length>128</length>
- <comment>Path to components main directory in a form of a class
- namespace.
- </comment>
+ <comment>Path to components main directory in a form of a class namespace.</comment>
<add>2.0</add>
</field>
</table>
<type>int unsigned</type>
<default>1</default>
<comment>Used to group mapping_field records into related sets (e.g. for criteria sets in search builder
- mappings).
- </comment>
+ mappings).</comment>
<add>1.5</add>
</field>
<field>
<pseudoconstant>
<optionGroupName>tag_used_for</optionGroupName>
</pseudoconstant>
+ <serialize>COMMA</serialize>
<add>3.2</add>
</field>
<field>
<import>true</import>
<serialize>SEPARATOR_BOOKEND</serialize>
<comment>Populate with the label (text) associated with a fee level for paid events with multiple levels. Note that
- we store the label value and not the key
- </comment>
+ we store the label value and not the key</comment>
<add>1.7</add>
</field>
<field>
{foreach from=$table.fields item=field}
/**
{if $field.comment}
- * {$field.comment}
+ * {$field.comment|regex_replace:"/\n[ ]*/":"\n* "}
*
{/if}
* @var {$field.phpType}
{if $field.rule}
'rule' => '{$field.rule}',
{/if} {* field.rule *}
+{if $field.protected}
+ 'protected' => '{$field.protected}',
+{/if}
{if $field.default || $field.default === '0'}
'default' => '{if ($field.default[0]=="'" or $field.default[0]=='"')}{$field.default|substring:1:-1}{else}{$field.default}{/if}',
{/if} {* field.default *}
),
{/if}
{if $field.pseudoconstant}
- 'pseudoconstant' => {$field.pseudoconstant|@print_array}
+ 'pseudoconstant' => {$field.pseudoconstant|@print_array},
{/if} {* field.pseudoconstant *} ),
{/foreach} {* table.fields *}
);
<?xml version="1.0" encoding="iso-8859-1" ?>
<version>
- <version_no>5.14.alpha1</version_no>
+ <version_no>5.15.alpha1</version_no>
</version>