GetEntityName) * but declaring it seems more legible. * * @return string */ protected function getApiEntityName(): string { return 'Contribution'; } /** * Metadata about the entity fields. * * @var array */ protected $fieldMetadata = []; /** * Get a list of tokens whose name and title match the DB fields. * @return array */ protected function getPassthruTokens(): array { return [ 'contribution_page_id', 'source', 'id', 'receive_date', 'total_amount', 'fee_amount', 'net_amount', 'non_deductible_amount', 'trxn_id', 'invoice_id', 'currency', 'cancel_date', 'receipt_date', 'thankyou_date', 'tax_amount', 'contribution_status_id', 'financial_type_id', 'payment_instrument_id', ]; } /** * Get tokens supporting the syntax we are migrating to. * * In general these are tokens that were not previously supported * so we can add them in the preferred way or that we have * undertaken some, as yet to be written, db update. * * See https://lab.civicrm.org/dev/core/-/issues/2650 * * @return string[] */ public function getBasicTokens(): array { $return = []; foreach (['contribution_status_id', 'payment_instrument_id', 'financial_type_id', 'contribution_page_id'] as $fieldName) { $return[$fieldName] = $this->getFieldMetadata()[$fieldName]['title']; } return $return; } /** * Class constructor. */ public function __construct() { $tokens = CRM_Utils_Array::subset( CRM_Utils_Array::collect('title', $this->getFieldMetadata()), $this->getPassthruTokens() ); $tokens = array_merge($tokens, $this->getPseudoTokens(), CRM_Utils_Token::getCustomFieldTokens('Contribution')); parent::__construct('contribution', $tokens); } /** * Check if the token processor is active. * * @param \Civi\Token\TokenProcessor $processor * * @return bool */ public function checkActive(TokenProcessor $processor) { return !empty($processor->context['actionMapping']) && $processor->context['actionMapping']->getEntity() === 'civicrm_contribution'; } /** * Alter action schedule query. * * @param \Civi\ActionSchedule\Event\MailingQueryEvent $e */ public function alterActionScheduleQuery(MailingQueryEvent $e): void { if ($e->mapping->getEntity() !== 'civicrm_contribution') { return; } $fields = $this->getFieldMetadata(); foreach ($this->getPassthruTokens() as $token) { $e->query->select('e.' . $fields[$token]['name'] . ' AS ' . $this->getEntityAlias() . $token); } foreach (array_keys($this->getPseudoTokens()) as $token) { $split = explode(':', $token); $e->query->select('e.' . $fields[$split[0]]['name'] . ' AS ' . $this->getEntityAlias() . $split[0]); } } /** * @inheritDoc * @throws \CRM_Core_Exception */ public function evaluateToken(TokenRow $row, $entity, $field, $prefetch = NULL) { $actionSearchResult = $row->context['actionSearchResult']; $aliasedField = $this->getEntityAlias() . $field; $fieldValue = $actionSearchResult->{$aliasedField} ?? NULL; if ($this->isPseudoField($field)) { $split = explode(':', $field); return $row->tokens($entity, $field, $this->getPseudoValue($split[0], $split[1], $actionSearchResult->{"contrib_$split[0]"} ?? NULL)); } if ($this->isMoneyField($field)) { return $row->format('text/plain')->tokens($entity, $field, \CRM_Utils_Money::format($fieldValue, $actionSearchResult->contrib_currency)); } if ($this->isDateField($field)) { return $row->format('text/plain')->tokens($entity, $field, \CRM_Utils_Date::customFormat($fieldValue)); } if ($this->isCustomField($field)) { $row->customToken($entity, \CRM_Core_BAO_CustomField::getKeyID($field), $actionSearchResult->entity_id); } else { $row->format('text/plain')->tokens($entity, $field, (string) $fieldValue); } } }