Development issueshttps://lab.civicrm.org/groups/dev/-/issues2024-02-25T05:03:21Zhttps://lab.civicrm.org/dev/core/-/issues/3073PledgePayment statuses used doesn't correspond to reported options available.2024-02-25T05:03:21ZBradley TaylorPledgePayment statuses used doesn't correspond to reported options available.When using the API (v3 or v4) a pledgepayment status accepts either "Completed", "Pending", "Cancelled" or "Overdue":
![Screenshot_2022-02-16_at_16.42.18](/uploads/caba9893c1ce8cc706b8285d78050bf4/Screenshot_2022-02-16_at_16.42.18.png)
...When using the API (v3 or v4) a pledgepayment status accepts either "Completed", "Pending", "Cancelled" or "Overdue":
![Screenshot_2022-02-16_at_16.42.18](/uploads/caba9893c1ce8cc706b8285d78050bf4/Screenshot_2022-02-16_at_16.42.18.png)
However, in practice a wider set of values are supported. To demonstrate this:
1. Create a new pledge
2. Mark a payment against the first pledge
3. View the created pledge payment. Click edit and set the payment contribution status to "Refunded". Save the payment.
4. The pledge payment now has a status of "Refunded" which was not one of the statuses shown by the API explorer.
Looking at the config for a pledgepayment I can see that the status field uses the `contribution_status` pseudoconstant. However, in `CRM_Pledge_BAO_PledgePayment::buildOptions` the options are retrieved from `CRM_Pledge_BAO_Pledge::buildOptions` which uses the `pledge_status` pseudoconstant.
I highly suspect `CRM_Pledge_BAO_PledgePayment::buildOptions` should just return the `contribution_status` options, maybe with some of the less relevant options filtered out. It seems mad that internal Civi logic would put a pledgepayment into a state which isn't shown as valid through the API.
It appears the available options are not validated, so if you hand-build the API query it does seem to be possible to use a pledgepayment/contribution_status which does not correspond to one of "Completed", "Pending", "Cancelled" or "Overdue".https://lab.civicrm.org/dev/core/-/issues/3532Determine CiviCRM host and port in Docker-friendly way - via an environment v...2024-02-25T05:03:20ZMichael McAndrewDetermine CiviCRM host and port in Docker-friendly way - via an environment variablehttps://lab.civicrm.org/dev/core/-/issues/5030Columns are misaligned on find participants results2024-02-24T22:10:31ZDaveDColumns are misaligned on find participants resultsI'm not sure if this is recent but seems like something I would have noticed before.
Columns to the right of Amount appear shifted to the right by one.
![untitled3](/uploads/c5254fe4deade1cc45002272980f4a6f/untitled3.png)I'm not sure if this is recent but seems like something I would have noticed before.
Columns to the right of Amount appear shifted to the right by one.
![untitled3](/uploads/c5254fe4deade1cc45002272980f4a6f/untitled3.png)5.72.0https://lab.civicrm.org/dev/core/-/issues/3650Copying a mailing results in thousands of entries in civicrm_mailing_group, r...2024-02-24T05:03:29ZJonGoldCopying a mailing results in thousands of entries in civicrm_mailing_group, rendering page unresponsiveI'll start by saying I haven't been able to replicate this - but I've seen it happen multiple times on Civi 5.39 to 5.41. I'm hoping someone else finds this and it rings a bell.
Sometimes, when a client goes to edit a mailing, the page...I'll start by saying I haven't been able to replicate this - but I've seen it happen multiple times on Civi 5.39 to 5.41. I'm hoping someone else finds this and it rings a bell.
Sometimes, when a client goes to edit a mailing, the page is either a) unresponsive, or b) doesn't allow saving. The "calculating recipients" SQL is running indefinitely. When investigating, there are tens of thousands of entries in `civicrm_mailing_group` for that mailing - the `entity_id`s repeat.
While I'm unable to replicate, this seems to happen when:
* Users copy an existing mailing rather than starting from a new mailing;
* In both cases, mailings were going out to 17-24 groups.https://lab.civicrm.org/dev/core/-/issues/3647Deleting C or Final mailing for A/B test makes report on A and B segments unv...2024-02-24T05:03:28ZlarsssandergreenDeleting C or Final mailing for A/B test makes report on A and B segments unviewableIf you create and A/B test, send the A & B segments and then delete the C or Final segment from Draft and Unscheduled Mailings, you can no longer view the mailing report for the A/B test. The mailing report URL just shows a blank page wi...If you create and A/B test, send the A & B segments and then delete the C or Final segment from Draft and Unscheduled Mailings, you can no longer view the mailing report for the A/B test. The mailing report URL just shows a blank page with header and footer.
I think it is probably not that uncommon an occurrence for someone to create an A/B test and later need to make a small change to the final version before sending it. That's easy enough to do by re-using one of the mailings and excluding the A and B mailings from your recipients. However, you will probably delete the C mailing from the unscheduled list at this point and then no longer be able to view the original A/B mailing report.
I'm testing on 5.28.4. This happens with both Mosaico and traditional mailings.https://lab.civicrm.org/dev/core/-/issues/5012Php 8.3 Calling get_parent_class() without arguments is deprecated2024-02-23T21:33:57ZsadashivPhp 8.3 Calling get_parent_class() without arguments is deprecatedOverview
----------------------------------------
Using civicrm 5.69.3, php 8.3, smarty 3 (using civicrm.settings.php)
Reproduction steps
----------------------------------------
1. Created a code snippet to send a simple simple email u...Overview
----------------------------------------
Using civicrm 5.69.3, php 8.3, smarty 3 (using civicrm.settings.php)
Reproduction steps
----------------------------------------
1. Created a code snippet to send a simple simple email using CRM_Utils_Mail::Send()
2. The html should have some tokens
3. In the received email I see above error
Current behaviour
----------------------------------------
Email has text as
Deprecated: Calling get_parent_class() without arguments is deprecated in /var/www/html/my_site/vendor/civicrm/civicrm-core/CRM/Core/SmartyCompatibility.php on line 148
Expected behaviour
----------------------------------------
No error should be reported in the email sendout.
Environment information
----------------------------------------
* __CiviCRM:__ 5.69.3
* __PHP:__ 8.3
* __CMS:__ Drupal 10.2.2
* __Database:__ _MySQL 8
* __Web Server:__ _Apache 2.45.70.1https://lab.civicrm.org/dev/core/-/issues/5007Membership renewal page not selecting current membership level, but selecting...2024-02-23T21:33:32ZcomposerjkMembership renewal page not selecting current membership level, but selecting default insteadOverview
----------------------------------------
The membership contribution page for a renewal seems to select the default contribution membership level instead of the existing level for the user.
Mattermost [mention](https://chat.civ...Overview
----------------------------------------
The membership contribution page for a renewal seems to select the default contribution membership level instead of the existing level for the user.
Mattermost [mention](https://chat.civicrm.org/civicrm/pl/hinxqhmjofn3id6bu6cygj7dia) (but only that it happened).
Reproduction steps
----------------------------------------
1. Go to a join/renew Membership Contribution page link for an existing membership that has a level different than the default.
2. See that the default is selected even when the existing membership is at a different level.
Current behaviour
----------------------------------------
Here's an example on our site with a current `Full Membership` but seeing that `Contributing Membership` is selected (the current default when joining without a membership).
![civi-5.70.0-renewal-not-selecting-current-membership](/uploads/cbb84f3652f7ca430cbf4f0da97475eb/civi-5.70.0-renewal-not-selecting-current-membership.png)
Expected behaviour
----------------------------------------
The `Full Membership` radio button (in this case, button) should be selected, as that's the sample user's existing membership level.
Environment information
----------------------------------------
* __CiviCRM:__ 5.70.0 (but may have also started earlier)
* __PHP:__ 8.1.27
* __CMS:__ WordPress 6.4.3
* __Database:__ MariaDB 10.6.x5.70.1https://lab.civicrm.org/dev/core/-/issues/4905Caching of CustomField metadata is a mess2024-02-23T20:13:59ZcolemanwCaching of CustomField metadata is a messBackground
-------
Multiple forms and functions need a list of custom fields. For example:
- Import forms need to know which custom fields can be imported
- SearchKit needs to know what fields can be searched & displayed
- Every crud fo...Background
-------
Multiple forms and functions need a list of custom fields. For example:
- Import forms need to know which custom fields can be imported
- SearchKit needs to know what fields can be searched & displayed
- Every crud form needs to display custom data sets
- Afform needs the list of custom fields
- etc. etc. etc.
Due to time, entropy and other "real world" stuff, most of these have developed their own peculiar way of gathering the list of custom fields, and implemented their own quirky ways of caching it.
What it should look like
-----------
A sensible model would be to have 1 function that returns a cached list of all custom fields. Caching would happen only once, and only in this function. All other code that needed to fetch a list of custom fields would call this function. All transformations of the master list (e.g. filtering by entity type, filtering by user permissions) should happen downstream and should not be re-cached.
What it actually looks like
-------
The technical term for what we have now is "a mess." No one function exists. Lots of redundancy. Some places don't cache at all which kills performance (APIv4 getfields included). Some other places create huge bloated caches which waste memory. Yet other places take those already cached lists and waste even more memory by caching them again!colemanwcolemanwhttps://lab.civicrm.org/dev/core/-/issues/3292Upgrade select2 to stable version 4.0.4 and fix compatibility issues in Civi2024-02-23T17:58:01ZMonish DebUpgrade select2 to stable version 4.0.4 and fix compatibility issues in CiviCurrently, Civi is using select2 3.5 which we need to upgrade to latest stable 4.0.4 (https://github.com/select2/select2/releases) and also resolve compatibility issues with CiviCRM.
Major issues:
1. Auto appending values doesn't work a...Currently, Civi is using select2 3.5 which we need to upgrade to latest stable 4.0.4 (https://github.com/select2/select2/releases) and also resolve compatibility issues with CiviCRM.
Major issues:
1. Auto appending values doesn't work anymore
Error: Uncaught TypeError: Cannot read property 'prop' of undefined
LOC - https://github.com/civicrm/civicrm-core/blob/master/js/crm.searchForm.js#L9
Reference - https://select2.org/upgrading/migrating-from-35#select2-val
2. Placeholder broken
Error: Uncaught TypeError: Cannot read property 'id' of undefined
As per 3.5 - placeholderOption is used to set the placeholder value for select2 widget
As per 4.0.4 - placeholder option can now accept placeholder value both in string and object
Reference - https://select2.org/upgrading/migrating-from-35#more-flexible-placeholders
3. EntityRef select2 fields are broken
Error: Uncaught Error: No select2/compat/initSelection
As per 4.0.4 - Removed the requirement of 'initSelection'
Reference - https://select2.org/upgrading/migrating-from-35#removed-the-requirement-of-initselection
4. Navigation menu style is not applied
Error: Uncaught TypeError: Cannot read property 'prop' of undefined
As per 4.0.4 - $("select").val("1").trigger("change"); // instead of $("select").select2("val", "1");
Reference - https://select2.org/upgrading/migrating-from-35#select2-val
5. Broken entityRef field
There are multiple issues with an entityRef field which are listed below:
1. Placeholder doesn't show
2. Unable to populate data via REST API link
3. Create contact dialog box doesn't render below the search field
4. Escape text doesn't show up
6. Action-menu select2 doesn't work on selecting record(s) in a search list
It throws an error `Uncaught TypeError: Cannot read property 'apply' of undefined` after Search and also action-menu field doesn't behave on selecting a record.
7. The native crm CSS styling doesn't apply on select2/4.0+ widget
Minor issues
1. Multi select2 widget doesn't show downarrow placeholder icon
2. select2 css style aren't applied after upgradehttps://lab.civicrm.org/dev/core/-/issues/4996Standalone - user documentation for user management functionality2024-02-23T16:54:58ZufundoStandalone - user documentation for user management functionalityWould be good to write some user documentation for how to use the standaloneusers user management screen.
I think this belongs somewhere here: https://docs.civicrm.org/sysadmin/en/latest/setup/ ?Would be good to write some user documentation for how to use the standaloneusers user management screen.
I think this belongs somewhere here: https://docs.civicrm.org/sysadmin/en/latest/setup/ ?https://lab.civicrm.org/dev/core/-/issues/4975FormBuilder: Case Status field shows disabled statuses2024-02-23T15:32:47ZnoahFormBuilder: Case Status field shows disabled statusesThe Case Type admin screen (e.g. civicrm/a/#/caseType/1) allows you to disable some case statuses for a given case type.
When you create a Case submission form in FormBuilder, and add the Case Status field to the form, all case statuses...The Case Type admin screen (e.g. civicrm/a/#/caseType/1) allows you to disable some case statuses for a given case type.
When you create a Case submission form in FormBuilder, and add the Case Status field to the form, all case statuses are available in the resulting widget, regardless of whether they're enabled for the case type.
You can manually remove some of the status options, but they won't stay in sync with the Case Type admin screen.https://lab.civicrm.org/dev/core/-/issues/4929SK based on DB Entity includes contacts from the trash even when not specifie...2024-02-23T15:31:51ZlottieSK based on DB Entity includes contacts from the trash even when not specified as criteria## Overview
_When DB Entity is used as the 'search for' entity, it includes contacts from the trash even if not specified in the criteria of the original SK where the DB Entity display was constructed._
_This is the original post in _[...## Overview
_When DB Entity is used as the 'search for' entity, it includes contacts from the trash even if not specified in the criteria of the original SK where the DB Entity display was constructed._
_This is the original post in _[_Mattermost_](https://chat.civicrm.org/civicrm/pl/nji7p7prsid7dkf6p7ha3qksha)_._
## Reproduction steps
1. To test this you **_need to have some deleted contacts in your trash_**.
2. **Add a new** **SK** and do not change anything in the compose window (entity Contacts, everything default).
3. **Add a DB Entity display** to the SK you created in step 1 and preview it
4. **Save the SK** and **clear the cache** (I'm finding a have to clear the cache a 2-3 times)
5. **Add a new SK**
6. As the first **search for** entity, **_choose the DB Entity_** you created in step 2 and view the results
## Current behaviour
_The results returned for the child SK based on the DB Entity are higher than the results returned for the parent (first) SK. And the table created for the SK DB Entity the same number as shown in child SK. Note the result count in each of the following images. I have two contacts in the trash._
The SK created in step 1 (the parent for the DB Entity display - _Basic Contact Search_) has 201 results.
![sk-basic-contact-search_1.png](/uploads/c39cf6e5f33df445605656635569d70c/sk-basic-contact-search_1.png)
The SK where the DB Entity (_Basic Contact Search Child)_ created in step 1 is used as the **Search for** entity has 203 results.
![sk-basic-contact-search-child-based-on-db-entity_2.png](/uploads/7b7b5f3cc961fd0d3338fd06ea7726fa/sk-basic-contact-search-child-based-on-db-entity_2.png)
If I add the following where clause to the parent SK (_Basic Contact Search)_:
``WHERE (`a`.`is_deleted` = "0")``
![sk-basic-contact-search-addwhere-trash.png](/uploads/2a894589478f15154cebea240eaccbad/sk-basic-contact-search-addwhere-trash.png){width=491 height=178}
I get the correct result in my SK (_Basic Contact Search Child_) that is based on the DB Entity. The 201 results matches the original SK (_Basic Contact Search_).
![sk-basic-contact-search-child-updated.png](/uploads/ea5ebf91d8dc36c941cfa90a6409c411/sk-basic-contact-search-child-updated.png){width=525 height=272}
## Expected behaviour
_One should not be required to add the where clause to exclude the contacts in the trash. It seems as though that should be the default behaviour._
## Environment information
* **Browser:** _Firefox 59.0.1/Chrome 78.0.3904/Safari 13_
* **CiviCRM:** _5.69.2_
* **PHP:** _8.0_
* **CMS:** _Drupal 7.99_
* **Database:** _MariaDB 10.6_
* **Web Server:** _Apache 2.4_colemanwcolemanwhttps://lab.civicrm.org/dev/core/-/issues/4916Invisible notes2024-02-23T15:31:02ZBohdanDmytryshynInvisible notesOverview
----------------------------------------
On install or update CiviCRM, null-valued notes creating.
After researching, I can assume that the problem is a misassignment of keys.
![image](/uploads/9f4fb6a13d4cf2460a5a5c87d238b3d6/...Overview
----------------------------------------
On install or update CiviCRM, null-valued notes creating.
After researching, I can assume that the problem is a misassignment of keys.
![image](/uploads/9f4fb6a13d4cf2460a5a5c87d238b3d6/image.png)
Environment information
----------------------------------------
* __CiviCRM:__ _Master/5.67.1_
* __PHP:__ _/7.1/8.1_
* __CMS:__ Joomla 4.4.2/WordPress 6.4.2/..._https://lab.civicrm.org/dev/core/-/issues/5017Fatal Error with Angular Manager.php after upgrading to CiviCRM 5.69.52024-02-23T15:18:48ZLKuttnerFatal Error with Angular Manager.php after upgrading to CiviCRM 5.69.5After upgrading to CiviCRM 5.69.5 from 5.64.4 we get a WSOD.
`Parse error: syntax error, unexpected '=' in .../modules/civicrm/Civi/Angular/Manager.php on line 98`
`Fatal error: Exception thrown without a stack frame in Unknown on line...After upgrading to CiviCRM 5.69.5 from 5.64.4 we get a WSOD.
`Parse error: syntax error, unexpected '=' in .../modules/civicrm/Civi/Angular/Manager.php on line 98`
`Fatal error: Exception thrown without a stack frame in Unknown on line 0
`
I have not been able to identify what is causing this.
I have disabled all the non-standard CiviCRM extensions, with no change.
This is on Drupal 7.99 with PHP 7.3.33. Thank you for any help you can offer.https://lab.civicrm.org/dev/core/-/issues/5015'Clean-up Temporary Data and Files' doesn't empty the tplCache by default2024-02-23T15:18:23ZAndrew West'Clean-up Temporary Data and Files' doesn't empty the tplCache by defaultThe 'Clean-up temporary data and files' scheduled job [doesn't clean the tpl directory by default](https://github.com/civicrm/civicrm-core/blob/06540d39dc2cedcadb19be5c351ef831a9133534/api/v3/Job.php#L631). Should it? We see this balloon...The 'Clean-up temporary data and files' scheduled job [doesn't clean the tpl directory by default](https://github.com/civicrm/civicrm-core/blob/06540d39dc2cedcadb19be5c351ef831a9133534/api/v3/Job.php#L631). Should it? We see this ballooning to tens of gigabytes when sending large mailings.
Workaround is to add the parameter, but it seems like this might catch some people out.
![image](/uploads/85b4275fb08070a8995fe094e32d466e/image.png)https://lab.civicrm.org/dev/core/-/issues/3641[Feature] More (privacy) options for click tracking2024-02-23T05:03:23Zmarcelklehr[Feature] More (privacy) options for click trackingHello,
I would like to have more options regarding click tracking in mailings.
1. Currently, every user can decide for themselves if they want to use it. I would like to be able override this with a setting, so i can e.g. disable click...Hello,
I would like to have more options regarding click tracking in mailings.
1. Currently, every user can decide for themselves if they want to use it. I would like to be able override this with a setting, so i can e.g. disable click tracking entirely.
2. Click-throughs are currently tracked by mail-adress, which is not conformant to the privacy laws in Germany, or at least requires additional consent. It would be nice to be able to limit this to just the numbers per link, without personal data. I would like to have this as an admin option, too.
Thanks for your consideration and this awesome software!https://lab.civicrm.org/dev/core/-/issues/3639When using a smart group as a mailing, users whose state changes after the ma...2024-02-23T05:03:22ZrichardsplaygroundWhen using a smart group as a mailing, users whose state changes after the mailing is created but before the mailing is sent are not correctly countedCiviCRM 5.8.2 on Drupal 7.
When a mailing is created with a smart group and is scheduled to be sent in the future, user state changes between the time the mailing is created and the time it is sent do not get accounted for:
1. If a us...CiviCRM 5.8.2 on Drupal 7.
When a mailing is created with a smart group and is scheduled to be sent in the future, user state changes between the time the mailing is created and the time it is sent do not get accounted for:
1. If a user is added to the smart group in that period, they do not get the mailing.
2. If a user's private settings change (e.g. do not mail is checked) in that period, they receive the mailing anyway.
3. If a user is removed from the smart group in that period, they do get the mailing.
Problem 3 may be resolved by mail#28. Problem 2 is an edge case, albeit an important one. Problem 1 is a challenge for our organization, as we frequently pre-create marketing emails for our events months in advance during our slow periods, only to have them not reach newly added community members when they are finally sent.
Not more than a dabbler at development so cannot offer a PR. We would be willing to kick in some funding to have this resolved so that we can create marketing emails when we want, and have them reach all users in the smart group as per the group membership at the time of sending. (Within reason, does not have to be "real time" but the group membership as of an hour or so before sending is fine. Perhaps a cron job to update the mail job's recipient list would suffice?)https://lab.civicrm.org/dev/core/-/issues/5019When an event registration is transferred to another contact the Participants...2024-02-23T04:45:41Zjustinfreeman (Agileware)When an event registration is transferred to another contact the Participants Custom Field values are NOT transferred to the new event registration - sometimes this is requuiredWhen an event registration is transferred to another contact the Participants Custom Field values are NOT transferred to the new event registration.
In this case, there is a user expectation that the values entered into the Participants...When an event registration is transferred to another contact the Participants Custom Field values are NOT transferred to the new event registration.
In this case, there is a user expectation that the values entered into the Participants Custom Field values would be transferred, primarily because this person was registering someone else on their behalf.
Appreciate that this may not be applicable in all instances, so would be good to have an option available during the transfer to copy over the field values as part of the transfer process.
As shown below.
This is the original event registration, showing the custom fields entered during registration.
![image](/uploads/58acedae2eb36daa606f120ab616d70a/image.png)
The transferred event registration, showing the custom fields are empty.
![image](/uploads/1ec3df551e089aea0adbd7e0834712b1/image.png)
Agileware Ref: CIVICRM-2214https://lab.civicrm.org/dev/drupal/-/issues/194Recent Items block on the non-CiviCRM pages will have a missing CRM JS error2024-02-22T16:59:37ZherbdoolRecent Items block on the non-CiviCRM pages will have a missing CRM JS errorWe've got a site where the Recent Items block is on a non-CiviCRM page. It seems to work but there's a JS error of the `CRM` object is missing. I had put `\CRM_Core_Resources::singleton()->addCoreResources();` in a custom event subscribe...We've got a site where the Recent Items block is on a non-CiviCRM page. It seems to work but there's a JS error of the `CRM` object is missing. I had put `\CRM_Core_Resources::singleton()->addCoreResources();` in a custom event subscriber but that no longer plays nice with CiviCRM core. So perhaps adding it to the `CivicrmBlock` plugin class would be better. It seems that Drupal can't assume that the block will have everything loaded. In my testing, adding it in `__construct()` after `$civicrm->initialize();` works.5.72.0https://lab.civicrm.org/dev/core/-/issues/4634Replace all form-assigned variables from event workflow templates2024-02-22T05:21:07ZeileenReplace all form-assigned variables from event workflow templates**The goal is to remove all form based variables from the event workflow templates in order to**
1) make them work consistently from whereever they are called
2) make them display in preview mode (eg. with Message Admin extension)
3) re...**The goal is to remove all form based variables from the event workflow templates in order to**
1) make them work consistently from whereever they are called
2) make them display in preview mode (eg. with Message Admin extension)
3) reduce hacky code in the form layer with associated brittleness & fragility
4) eliminate the notices
5) make the code more similar on event templates
**To this end we have a few strategies**
1) Use tokens whereever possible. These are standardised across Workflow Templates & Event templates & follow consistent naming
2) Establish consistent variables to be assigned at the WorkFlow layer where tokens are not suitable
**Status**
**Workflow variables**
- `$participants` - this is an array of all participants associated with the registration with details in subkeys:
- contact_display_name
- line_items
- totals
- `$participantDetail` - the item from the above array that relates to the recipient participant
- `$isPrimary` is this the primary participant
- `$taxTerm` is broadly available in workflow templates - eg 'VAT'
- `$isShowLineItems` (comes from the price set is_quick_config)
**Tokens**
Tokens are available from event, participant, contact & contribution entities
**To do**
- [ ] Work through variables `$isOnWaitlist` `$isRequireApproval` (all event forms)
- [ ] Replace `$participant_status` with a token (online receipt)
- [ ] Replace is_pay_later with token (online receipt)
- [ ] Replace isAmountZero with token (online receipt)
- [ ] Replace isAdditionalParticipant with !$isPrimary (online receipt)
- [ ] Replace {$pay_later_receipt} with token (offline receipt)
- [ ] Replace event_confirm_text with token (online receipt)
- [ ] Replace `$receive_date`, financialType (online receipt)
- [ ] Replace isShowLocation with token (online receipt)
- [ ] Make sense of `$payer.name` (online receipt)
- [ ] Assign billingName, address from the ContributionWorkflowTrait or token - comes from civicrm_contribution.address_id.*
- [ ] Maybe credit_card_type, number etc come from the financial_trxn table
- [ ] Replace `$lineItems|@count` with something from the participant array & doesn't used smarty-2-only |@count (online & offline receipt)
- [ ] Replace $priceSetFieldsCount with something from the workflow message template layer, also `{foreach from=$lineItem item=pcount}` loop
- [ ] Replace $event.confirm_email_text with `$userText` offline receipt
- [ ] Move event_registration_receipt to event cart - this extension is being phased out so we can let it go once that is the case
- [ ] Move assigning `customGroups` to the workflow template (offline receipt) https://github.com/civicrm/civicrm-core/pull/27596
- [ ] Move assigning profiles to the workflow template (online receipt)
- [ ] Get tokens & token substution & examples working for remaining participant templates -transfered, cancelled etc
- [ ] $hookDiscountMessage - ? not sure