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

ContactSummary - Replace Membership tab with Searchkit display #28810

Merged
merged 8 commits into from
Jan 12, 2024
13 changes: 12 additions & 1 deletion CRM/Member/DAO/MembershipType.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
* Generated from xml/schema/CRM/Member/MembershipType.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
* (GenCodeChecksum:bf10593b5e20b28573e422fadfe689a7)
* (GenCodeChecksum:10ecb0e9e2b7693f4aeebeccce7407a3)
*/

/**
Expand Down Expand Up @@ -38,6 +38,17 @@ class CRM_Member_DAO_MembershipType extends CRM_Core_DAO {
*/
public static $_log = TRUE;

/**
* Paths for accessing this entity in the UI.
*
* @var string[]
*/
protected static $_paths = [
'add' => 'civicrm/admin/member/membershipType/add?action=add&reset=1',
'update' => 'civicrm/admin/member/membershipType/add?action=update&id=[id]&reset=1',
'delete' => 'civicrm/admin/member/membershipType/add?action=delete&id=[id]&reset=1',
];

/**
* Membership ID
*
Expand Down
137 changes: 137 additions & 0 deletions Civi/Api4/Service/Links/MembershipLinksProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
<?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 |
+--------------------------------------------------------------------+
*/

namespace Civi\Api4\Service\Links;

use Civi\API\Event\RespondEvent;
use Civi\Core\Event\GenericHookEvent;

/**
* @service
* @internal
*/
class MembershipLinksProvider extends \Civi\Core\Service\AutoSubscriber {
use LinksProviderTrait;

public static function getSubscribedEvents(): array {
return [
'civi.api4.getLinks' => 'alterMembershipLinks',
'civi.api.respond' => 'alterMembershipLinksResult',
];
}

public static function alterMembershipLinks(GenericHookEvent $e): void {
if ($e->entity == 'Membership') {
$addTemplate = [
'api_action' => 'update',
'ui_action' => '',
'entity' => 'Membership',
'path' => '',
'text' => '',
'icon' => 'fa-external-link',
'target' => 'crm-popup',
];
self::addLinks($e->links, $addTemplate);
}
}

public static function alterMembershipLinksResult(RespondEvent $e): void {
$request = $e->getApiRequest();
if ($request['version'] == 4 && $request->getEntityName() === 'Membership' && is_a($request, '\Civi\Api4\Action\GetLinks')) {
$links = (array) $e->getResponse();
$isUpdateBilling = $isCancelSupported = FALSE;

if (!\CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) {
self::unsetLinks($links, ['followup']);
}

$membershipId = $request->getValue('id');
$ownerMembershipId = $request->getValue('owner_membership_id');
if ($ownerMembershipId) {
self::unsetLinks($links, ['update', 'delete', 'renew', 'followup', 'cancelrecur', 'changebilling']);
}
elseif ($membershipId) {
$paymentObject = \CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($membershipId, 'membership', 'obj');
if (!empty($paymentObject)) {
$isUpdateBilling = $paymentObject->supports('updateSubscriptionBillingInfo');
}
if (!$isUpdateBilling) {
self::unsetLinks($links, ['changebilling']);
}
$isCancelSupported = \CRM_Member_BAO_Membership::isCancelSubscriptionSupported($membershipId);
if (!$isCancelSupported) {
self::unsetLinks($links, ['cancelrecur']);
}
}

// Unset renew and followup for deceased memberships.
$membershipStatus = $request->getValue('status_id:name');
if ($membershipStatus && $membershipStatus === 'Deceased') {
self::unsetLinks($links, ['renew', 'followup']);
}

$membershipTypeId = $request->getValue('membership_type_id');
if ($membershipTypeId && \CRM_Financial_BAO_FinancialType::isACLFinancialTypeStatus()) {
$finType = \Civi\Api4\MembershipType::get(TRUE)
->addSelect('financial_type_id:name')
->addWhere('id', '=', $membershipTypeId)
->execute()
->first()['financial_type_id:name'] ?? NULL;
if ($finType && !\CRM_Core_Permission::check('edit contributions of type ' . $finType)) {
self::unsetLinks($links, ['update', 'renew', 'followup']);
}
if ($finType && !\CRM_Core_Permission::check('delete contributions of type ' . $finType)) {
self::unsetLinks($links, ['delete']);
}
}

$e->getResponse()->exchangeArray(array_values($links));
}
}

private static function addLinks(array &$newLinks, array $addTemplate) {
$actions = [
'renew' => [
'path' => 'civicrm/contact/view/membership?action=renew&reset=1&cid=[contact_id]&id=[id]&context=membership&selectedChild=member',
'text' => ts('Renew Membership'),
],
'followup' => [
'path' => 'civicrm/contact/view/membership?action=renew&reset=1&cid=[contact_id]&id=[id]&context=membership&selectedChild=member&mode=live',
'text' => ts('Renew-Credit Card Membership'),
],
'cancelrecur' => [
'path' => 'civicrm/contribute/unsubscribe?reset=1&cid=[contact_id]&mid=[id]&context=membership&selectedChild=member',
'text' => ts('Cancel Auto-renewal'),
],
'changebilling' => [
'path' => 'civicrm/contribute/updatebilling?reset=1&cid=[contact_id]&mid=[id]&context=membership&selectedChild=member',
'text' => ts('Change Billing Details'),
],
];
foreach ($actions as $action => $values) {
$addTemplate['ui_action'] = $action;
$addTemplate['path'] = $values['path'];
$addTemplate['text'] = $values['text'];
$newLinks[] = $addTemplate;
}
}

private static function unsetLinks(array &$links, array $actions) {
foreach ($actions as $action) {
$actionLinkIndex = self::getActionIndex($links, $action);
if (isset($actionLinkIndex)) {
unset($links[$actionLinkIndex]);
}
}
}

}
16 changes: 16 additions & 0 deletions ext/civicrm_admin_ui/ang/afformTabMember.aff.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<div af-fieldset="">
<div class="af-markup">
<div class="alert alert-warning">Click Add Membership to record a new membership. Click Submit Credit Card Membership to process a Membership on behalf of the member using their credit card.</div>
</div>
<crm-search-display-table search-name="Contact_Summary_Memberships" display-name="Contact_Summary_Memberships_Active" filters="{contact_id: options.contact_id, 'status_id.is_current_member': true}"></crm-search-display-table>
<div class="af-markup">
<div class="alert alert-info font-red">Pending and Inactive Memberships </div>
</div>
<crm-search-display-table search-name="Contact_Summary_Memberships" display-name="Contact_Summary_Memberships_Inactive" filters="{contact_id: options.contact_id, 'status_id.is_current_member': false}"></crm-search-display-table>
</div>
<div class="af-markup">
<hr />
</div>
<div af-fieldset="" af-title="Membership Types">
<crm-search-display-table search-name="Contact_Summary_Membership_Type" display-name="Contact_Summary_Membership_Type"></crm-search-display-table>
</div>
19 changes: 19 additions & 0 deletions ext/civicrm_admin_ui/ang/afformTabMember.aff.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php
use CRM_CivicrmAdminUi_ExtensionUtil as E;

return [
'type' => 'search',
'title' => E::ts('Memberships'),
'placement' => [
'contact_summary_tab',
],
'summary_contact_type' => [
'Organization',
],
'summary_weight' => 30,
'icon' => 'fa-id-badge',
'permission' => [
'access CiviCRM',
'access CiviMember',
],
];
10 changes: 10 additions & 0 deletions ext/civicrm_admin_ui/ang/afsearchTabMember.aff.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<div af-fieldset="">
<div class="af-markup">
<div class="alert alert-warning">Click Add Membership to record a new membership. Click Submit Credit Card Membership to process a Membership on behalf of the member using their credit card.</div>
</div>
<crm-search-display-table search-name="Contact_Summary_Memberships" display-name="Contact_Summary_Memberships_Active" filters="{contact_id: options.contact_id, 'status_id.is_current_member': true}"></crm-search-display-table>
<div class="af-markup">
<div class="alert alert-info font-red">Pending and Inactive Memberships </div>
</div>
<crm-search-display-table search-name="Contact_Summary_Memberships" display-name="Contact_Summary_Memberships_Inactive" filters="{contact_id: options.contact_id, 'status_id.is_current_member': false}"></crm-search-display-table>
</div>
20 changes: 20 additions & 0 deletions ext/civicrm_admin_ui/ang/afsearchTabMember.aff.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
use CRM_CivicrmAdminUi_ExtensionUtil as E;

return [
'type' => 'search',
'title' => E::ts('Memberships'),
'placement' => [
'contact_summary_tab',
],
'summary_contact_type' => [
'Individual',
'Household',
],
'summary_weight' => 30,
'icon' => 'fa-id-badge',
'permission' => [
'access CiviCRM',
'access CiviMember',
],
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?php
use CRM_CivicrmAdminUi_ExtensionUtil as E;

return [
[
'name' => 'SavedSearch_Contact_Summary_Membership_Type',
'entity' => 'SavedSearch',
'cleanup' => 'unused',
'update' => 'unmodified',
'params' => [
'version' => 4,
'values' => [
'name' => 'Contact_Summary_Membership_Type',
'label' => E::ts('Contact Summary Membership Type'),
'api_entity' => 'MembershipType',
'api_params' => [
'version' => 4,
'select' => [
'name',
'period_type:label',
'financial_type_id:label',
'fixed_period_start_day',
'minimum_fee',
'duration_interval',
'visibility:label',
],
'orderBy' => [],
'where' => [
[
'is_active',
'=',
TRUE,
],
],
'groupBy' => [],
'join' => [],
'having' => [],
],
],
'match' => [
'name',
],
],
],
[
'name' => 'SavedSearch_Contact_Summary_Membership_Type_SearchDisplay_Contact_Summary_Membership_Type',
'entity' => 'SearchDisplay',
'cleanup' => 'unused',
'update' => 'unmodified',
'params' => [
'version' => 4,
'values' => [
'name' => 'Contact_Summary_Membership_Type',
'label' => E::ts('Contact Summary Membership Type'),
'saved_search_id.name' => 'Contact_Summary_Membership_Type',
'type' => 'table',
'settings' => [
'description' => E::ts('The following Membership Types are associated with this organization. Click Members for a listing of all contacts who have memberships of that type. Click Edit to modify the settings for that type.'),
'sort' => [],
'limit' => 50,
'pager' => [
'hide_single' => TRUE,
],
'placeholder' => 5,
'columns' => [
[
'type' => 'field',
'key' => 'name',
'dataType' => 'String',
'label' => E::ts('Name'),
'sortable' => TRUE,
],
[
'type' => 'field',
'key' => 'period_type:label',
'dataType' => 'String',
'label' => E::ts('Period'),
'sortable' => TRUE,
],
[
'type' => 'field',
'key' => 'fixed_period_start_day',
'dataType' => 'Integer',
'label' => E::ts('Fixed Start'),
'sortable' => TRUE,
],
[
'type' => 'field',
'key' => 'minimum_fee',
'dataType' => 'Money',
'label' => E::ts('Minimum Fee'),
'sortable' => TRUE,
],
[
'type' => 'field',
'key' => 'duration_interval',
'dataType' => 'Integer',
'label' => E::ts('Duration'),
'sortable' => TRUE,
'rewrite' => '[duration_interval] [duration_unit:label]',
],
[
'type' => 'field',
'key' => 'visibility:label',
'dataType' => 'String',
'label' => E::ts('Visibility'),
'sortable' => TRUE,
],
[
'size' => 'btn-xs',
'links' => [
[
'path' => 'civicrm/member/search?reset=1&force=1&type=[id]',
'icon' => 'fa-external-link',
'text' => E::ts('Members'),
'style' => 'default',
'condition' => [],
'task' => '',
'entity' => '',
'action' => '',
'join' => '',
'target' => 'crm-popup',
],
[
'entity' => 'MembershipType',
'action' => 'update',
'join' => '',
'target' => 'crm-popup',
'icon' => 'fa-pencil',
'text' => E::ts('Edit'),
'style' => 'default',
'path' => '',
'task' => '',
'condition' => [],
],
],
'type' => 'buttons',
'alignment' => 'text-right',
],
],
'actions' => FALSE,
'classes' => [
'table',
'table-striped',
],
],
],
'match' => [
'saved_search_id',
'name',
],
],
],
];
Loading