Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[REF] Be able to remove clients whom are not the primary client of th… #24841

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions CRM/Case/Form/DeleteClient.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<?php
/*
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC. All rights reserved. |
| |
| This work is published under the GNU AGPLv3 license with some |
| permitted exceptions and without any warranty. For full license |
| and copyright information, see https://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
use Civi\Api4\CaseContact;

/**
*
* @package CRM
* @copyright CiviCRM LLC https://civicrm.org/licensing
*/

/**
* This class assigns the current case to another client.
*/
class CRM_Case_Form_DeleteClient extends CRM_Core_Form {

/**
* case ID
* @var int
*/
protected $id;

/**
* Client ID
* @var int
*/
protected $cid;

/**
* Return ContactId
* @var int
*/
protected $returnContactId;

/**
* Build all the data structures needed to build the form.
*/
public function preProcess() {
$this->cid = CRM_Utils_Request::retrieve('cid', 'Positive', $this, TRUE);
$this->id = CRM_Utils_Request::retrieve('id', 'Positive', $this, TRUE);
$this->returnContactId = CRM_Utils_Request::retrieve('rcid', 'Positive', $this, TRUE);
$context = CRM_Utils_Request::retrieve('context', 'Alphanumeric', $this);

//get current client name.
$this->assign('currentClientName', CRM_Contact_BAO_Contact::displayName($this->cid));
$this->assign('id', $this->id);

//set the context.
$url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&force=1&cid={$this->cid}&selectedChild=case");
if ($context == 'search') {
$qfKey = CRM_Utils_Request::retrieve('key', 'String', $this);
//validate the qfKey
$urlParams = 'force=1';
if (CRM_Utils_Rule::qfKey($qfKey)) {
$urlParams .= "&qfKey=$qfKey";
}
$url = CRM_Utils_System::url('civicrm/case/search', $urlParams);
}
elseif ($context == 'dashboard') {
$url = CRM_Utils_System::url('civicrm/case', 'reset=1');
}
elseif (in_array($context, [
'dashlet',
'dashletFullscreen',
])) {
$url = CRM_Utils_System::url('civicrm/dashboard', 'reset=1');
}
$session = CRM_Core_Session::singleton();
$session->pushUserContext($url);
$caseContacts = CaseContact::get()->addWhere('case_id', '=', $this->id)->execute();
if (count($caseContacts) === 1) {
CRM_Core_Error::statusBounce(ts('Cannot Remove Client from case as is the only client on the case'), $url);
}
}

/**
* Build the form object.
*/
public function buildQuickForm() {
$this->add('hidden', 'id', $this->id);
$this->add('hidden', 'contact_id', $this->cid);
$this->addButtons([
[
'type' => 'submit',
'name' => ts('Remove Client from Case'),
],
[
'type' => 'cancel',
'name' => ts('Cancel'),
],
]);

// This form may change the url structure so should not submit via ajax
$this->preventAjaxSubmit();
}

/**
* Process the form.
*/
public function postProcess() {
$params = $this->controller->exportValues($this->_name);
civicrm_api3('CaseContact', 'get', [
'case_id' => $params['id'],
'contact_id' => $params['contact_id'],
'api.case_contact.delete' => ['id' => "\$value.id"],
]);
civicrm_api3('Activity', 'create', [
'activity_type_id' => 'Case Client Removed',
'subject' => ts('Case Client Removed'),
'source_contact_id' => CRM_Core_Session::getLoggedInContactID(),
'case_id' => $params['id'],
'target_contact_id' => $params['contact_id'],
]);

// user context
$url = CRM_Utils_System::url('civicrm/contact/view/case',
"reset=1&action=view&cid={$this->returnContactId}&id={$params['id']}&show=1"
);
CRM_Utils_System::redirect($url);

}

}
5 changes: 5 additions & 0 deletions CRM/Case/xml/Menu/Case.xml
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,9 @@
<title>Email</title>
<page_callback>CRM_Case_Form_Task_Email</page_callback>
</item>
<item>
<path>civicrm/contact/view/case/deleteClient</path>
<title>Remove Client</title>
<page_callback>CRM_Case_Form_DeleteClient</page_callback>
</item>
</menu>
16 changes: 16 additions & 0 deletions CRM/Upgrade/Incremental/php/FiveFiftySeven.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,22 @@ class CRM_Upgrade_Incremental_php_FiveFiftySeven extends CRM_Upgrade_Incremental
*/
public function upgrade_5_57_alpha1($rev): void {
$this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
$this->addTask('Add in Client Removed Activity Type', 'addCaseClientRemovedActivity');
}

public static function addCaseClientRemovedActivity() {
if (CRM_Core_Component::isEnabled('CiviCase')) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@seamuslee001 If I understand the previous note correctly, I think you need to do something a bit more nuanced. The above will prevent the activity type from being created if CiviCase is not enabled, which addresses the immediate concern. But if a person enables CiviCase at a later time, we need to make sure this activity is created. So perhaps we need to also add this code to the CiviCase enabling process?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In a stock install without civicase the case-y stuff is still always inserted into the db at install time, so we should always insert this one too. How about without the if and set it like:

'component_id' => CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_component WHERE name='CiviCase'"),

CRM_Core_BAO_OptionValue::ensureOptionValueExists([
'option_group_id' => 'activity_type',
'name' => 'Case Client Removed',
'label' => ts('Case Client was removed from Case'),
'description' => ts('Case client was removed from a case'),
'is_active' => TRUE,
'component_id' => CRM_Core_Component::getComponentID('CiviCase'),
'icon' => 'fa-trash',
]);
}
return TRUE;
}

}
Loading