Development issueshttps://lab.civicrm.org/groups/dev/-/issues2023-03-01T05:03:23Zhttps://lab.civicrm.org/dev/core/-/issues/1678Export time out avoidance2023-03-01T05:03:23ZeileenExport time out avoidanceSites have a php time out to prevent long running processes & out of control loops. However, there are some processes that are known to need more time that others & we can extend the timeout within php to keep them alive. This is pretty ...Sites have a php time out to prevent long running processes & out of control loops. However, there are some processes that are known to need more time that others & we can extend the timeout within php to keep them alive. This is pretty safe because it's within a loop so we extend a little each row rather a huge time extension
Basically we can check each iteration here & if less than 10 seconds remains we can add 10 seconds as a sort of heartbeat https://www.php.net/manual/en/function.set-time-limit.phphttps://lab.civicrm.org/dev/core/-/issues/4132Importing contact data from CSV into checkbox custom fields fails where CSV d...2023-03-01T01:47:07ZrfenwickImporting contact data from CSV into checkbox custom fields fails where CSV data is not an arrayOverview
----------------------------------------
When importing contacts using a CSV file, containing data intended for storage in custom fields, the import fails for any Individual where a target custom field has checkboxes, and the CS...Overview
----------------------------------------
When importing contacts using a CSV file, containing data intended for storage in custom fields, the import fails for any Individual where a target custom field has checkboxes, and the CSV row contains only one value to 'tick'. (nb. only the Contact Type "Individuals" has been tested)
[Stackexchange](https://civicrm.stackexchange.com/questions/43500/issues-with-contact-importing-mismatched-contact-type-and-more/43536#43536)
Reproduction steps
----------------------------------------
1. On Demo site, click on Contacts > Import Contacts
2. First row contains column headers: yes, Contact type: Individual, For duplicate contacts: Update
3. Choose Dedupe rule on Demo: ID Only
Upload a CSV file with this data:
| CiviCRM ID | Answer |
|------------|-------------------------|
| 249 | Answer1,Answer2,Answer3 |
| 250 | Answer3 |
Current behaviour
----------------------------------------
The import of 249 will succeed. The import of 250 will fail, as it contains only one item:
| Line Number | Reason | CiviCRM ID | Answer |
|-------------|-----------------------------------------------|------------|---------|
| 2 | '1' is not a valid option for field custom_16 | 250 | Answer3 |
Expected behaviour
----------------------------------------
Both rows should import, as the data in the CSV matches the answer options for Custom_16
Environment information
----------------------------------------
Fault replicated on Drupal Demo, and on Wordpress using CiviCRM 5.58.1
Wordpress environment running PHP 7.45.59.0https://lab.civicrm.org/dev/core/-/issues/3850Importing to checkbox field updates incorrectly2023-03-01T01:47:07ZandyburnsImporting to checkbox field updates incorrectlyReproduced this regression on https://wpmaster.demo.civicrm.org/ with 5.55.alpha1 also reported on 5.51.1, 5.53.0:
- Create checkbox custom field with option values of 1,2,3
- Import to this field
- Observe that values in db are now 0,1...Reproduced this regression on https://wpmaster.demo.civicrm.org/ with 5.55.alpha1 also reported on 5.51.1, 5.53.0:
- Create checkbox custom field with option values of 1,2,3
- Import to this field
- Observe that values in db are now 0,1,2
![image](/uploads/dc09ebbe334285c627c73f8194b4264f/image.png)
![image](/uploads/630dd2a9108ddf3e33d948bd2288cdbe/image.png)
![image](/uploads/800d0ec68a4f40cf17e86e026adb1582/image.png)
Pattern:
```
"1,2,3" becomes => "0,1,2"
"2,3,4" becomes => "1,2,3"
```
Same behavior exists using labels e.g. Red,Green,Blue.
Importing a singular option value e.g. "2" works as expected.
Ref: https://chat.civicrm.org/civicrm/pl/x1imgh3affbmfb4o9b6ei6fx4h5.55.0https://lab.civicrm.org/dev/core/-/issues/4138Form Builder - autocomplete input does not use configured filtering2023-02-28T20:17:23ZFrancis (Agileware)Form Builder - autocomplete input does not use configured filteringOverview
----------------------------------------
In the Form Builder (afform/admin), there is an option to filter autocomplete inputs by an existing saved search / autocomplete display, where appears to do no actual filtering
Reproduct...Overview
----------------------------------------
In the Form Builder (afform/admin), there is an option to filter autocomplete inputs by an existing saved search / autocomplete display, where appears to do no actual filtering
Reproduction steps
----------------------------------------
Confirmed on wpmaster (5.60-alpha1)
1. Enable Form Builder extension
2. Go to SearchKit
3. Create a search for Events that filters by type (e.g. Fundraiser), add an Autocomplete display to it and save
4. Go back to SearchKit and create another search for Participants
5. Add a required "Participant Event" (this step may not be necessary)
6. Add a Table display and save.
7. using the form drop-down, create a new form for your results table
8. Add a filter for the results table, Participant / Event field
9. Configure the field to use the saved search and autocomplete display from step (3)
10. Save the form and go to its display page
11. start searching for events (using the sample data, just entering the letter S is sufficient)
Current behaviour
----------------------------------------
The Autocomplete field gives you to option of selecting any event on the system. Looking in the network requests, it appears that the search and display are not passed into the API4 endpoint at all.
Expected behaviour
----------------------------------------
The Autocomplete field should give you **only** options that match the filter specified in step 3.
Environment information
----------------------------------------
* __Browser:__ Firefox 109 (also happens on Chrome)
* __CiviCRM:__ 5.57.0, 5.58.1, 5.60-alpha / Master
Occurs on wpmaster.demo.civicrm.org
Comments
----------------------------------------
Example configurations:
Autocomplete (Events) search:
```json
[
[
"SavedSearch",
"save",
{
"records": [
{
"name": "Fundraiser_events",
"label": "Fundraiser events",
"form_values": null,
"mapping_id": null,
"search_custom_id": null,
"api_entity": "Event",
"api_params": {
"version": 4,
"select": [
"id",
"title",
"event_type_id:label"
],
"orderBy": [],
"where": [
[
"event_type_id:name",
"=",
"Fundraiser"
]
],
"groupBy": [],
"join": [],
"having": []
},
"expires_date": null,
"description": null
}
],
"match": [
"name"
]
}
],
[
"SearchDisplay",
"save",
{
"records": [
{
"name": "Fundraiser_events_Autocomplete_1",
"label": "Fundraiser events Autocomplete 1",
"saved_search_id.name": "Fundraiser_events",
"type": "autocomplete",
"settings": {
"sort": [],
"columns": [
{
"type": "field",
"key": "title",
"dataType": "String"
}
]
},
"acl_bypass": false
}
],
"match": [
"name",
"saved_search_id"
]
}
]
]
```
Participant search and form:
```json
[
[
"SavedSearch",
"save",
{
"records": [
{
"name": "Fundraiser_Participants",
"label": "Fundraiser Participants",
"form_values": null,
"mapping_id": null,
"search_custom_id": null,
"api_entity": "Participant",
"api_params": {
"version": 4,
"select": [
"id",
"contact_id.display_name",
"Participant_Event_event_id_01.title",
"Participant_Event_event_id_01.event_type_id:label"
],
"orderBy": [],
"where": [],
"groupBy": [],
"join": [
[
"Event AS Participant_Event_event_id_01",
"INNER",
[
"event_id",
"=",
"Participant_Event_event_id_01.id"
]
]
],
"having": []
},
"expires_date": null,
"description": null
}
],
"match": [
"name"
]
}
],
[
"SearchDisplay",
"save",
{
"records": [
{
"name": "Fundraiser_Participants_Table",
"label": "Fundraiser Participants Table",
"saved_search_id.name": "Fundraiser_Participants",
"type": "table",
"settings": {
"description": null,
"sort": [],
"limit": 50,
"pager": [],
"placeholder": 5,
"columns": [
{
"type": "field",
"key": "contact_id.display_name",
"dataType": "String",
"label": "Contact",
"sortable": true,
"link": {
"path": "",
"entity": "Contact",
"action": "view",
"join": "contact_id",
"target": "_blank"
},
"title": "View Contact"
},
{
"type": "field",
"key": "Participant_Event_event_id_01.title",
"dataType": "String",
"label": "Event",
"sortable": true,
"link": {
"path": "",
"entity": "Event",
"action": "view",
"join": "Participant_Event_event_id_01",
"target": "crm-popup"
},
"title": "View Participant Event"
},
{
"type": "field",
"key": "Participant_Event_event_id_01.event_type_id:label",
"dataType": "Integer",
"label": "Event Type",
"sortable": true
}
],
"actions": true,
"classes": [
"table",
"table-striped"
]
},
"acl_bypass": false
}
],
"match": [
"name",
"saved_search_id"
]
}
],
[
"Afform",
"save",
{
"records": [
{
"name": "afsearchFindFundraiserParticipants",
"requires": [],
"title": "Find Fundraiser Participants",
"description": "",
"is_dashlet": false,
"is_public": false,
"is_token": false,
"permission": "view event participants",
"type": "search",
"icon": "fa-list-alt",
"server_route": "civicrm/fundraiser-participants",
"entity_type": null,
"join_entity": null,
"contact_summary": null,
"summary_contact_type": null,
"redirect": null,
"create_submission": null,
"navigation": null,
"layout": "<div af-fieldset=\"\">\n <af-field name=\"event_id\" defn=\"{saved_search: 'Fundraiser_events', input_attrs: {multiple: true}, search_display: 'Fundraiser_events_Autocomplete_1'}\" />\n <crm-search-display-table search-name=\"Fundraiser_Participants\" display-name=\"Fundraiser_Participants_Table\"></crm-search-display-table>\n</div>\n"
}
]
}
]
]
```
Agileware ref CIVICRM-2101https://lab.civicrm.org/dev/wordpress/-/issues/59Base page is only created on main site in WordPress Multisite2023-02-28T15:26:35ZhaystackBase page is only created on main site in WordPress MultisiteThe default behaviour of CiviCRM on WordPress Multisite is that the base page is not created on every site on which CiviCRM is activated. Instead, the base page is only auto-created on the main site. The absence of the base page on a sub...The default behaviour of CiviCRM on WordPress Multisite is that the base page is not created on every site on which CiviCRM is activated. Instead, the base page is only auto-created on the main site. The absence of the base page on a sub-site can lead to confusion - however it may be the desired behaviour when the WordPress Multisite instance is one where sub-sites are not truly "separate" e.g. sites built on frameworks such as Commons in a Box or MultilingualPress.
Proposed fix: auto-create the base page on all sites on which CiviCRM has been activated but allow plugins to enable the legacy switch to the main site behaviour.haystackhaystackhttps://lab.civicrm.org/dev/wordpress/-/issues/132Allow multiple Afform Shortcodes to run in a single request2023-02-28T15:17:15ZhaystackAllow multiple Afform Shortcodes to run in a single requestAfform Shortcodes are "pathless" and are not rendered via `invoke()` so it is possible for there to be multiple instances on a single page, post or archive.
Because Afform Shortcodes rely on adding their scripts to the markup via `CRM_...Afform Shortcodes are "pathless" and are not rendered via `invoke()` so it is possible for there to be multiple instances on a single page, post or archive.
Because Afform Shortcodes rely on adding their scripts to the markup via `CRM_Core_Resources::singleton()->addCoreResources();` during the `wp_head` action, they must be rendered before that action has fired.
An implementation of this also needs to allow for one or more Shortcodes that are rendered via `invoke()` and act accordingly.haystackhaystackhttps://lab.civicrm.org/dev/civicrm-asset-plugin/-/issues/20Missing file in whitelist: /core/ext/ckeditor4/js/ck-options.json2023-02-28T09:12:41ZTobias KrauseMissing file in whitelist: /core/ext/ckeditor4/js/ck-options.jsonI found this issue when I tried to edit the configuration of CKEditor here: /civicrm/admin/ckeditor
The select box for advanced options is missing here because the file /core/ext/ckeditor4/js/ck-options.json could not be loaded. It is n...I found this issue when I tried to edit the configuration of CKEditor here: /civicrm/admin/ckeditor
The select box for advanced options is missing here because the file /core/ext/ckeditor4/js/ck-options.json could not be loaded. It is not copied into my public library folder by this plugin.https://lab.civicrm.org/dev/core/-/issues/4106Add filter on pledge payment in contribution report templates2023-02-28T06:44:39ZyashodhaAdd filter on pledge payment in contribution report templates Add a filter on "contribution is a pledge payment Yes/No" in contribution report templates Add a filter on "contribution is a pledge payment Yes/No" in contribution report templatesyashodhayashodhahttps://lab.civicrm.org/dev/core/-/issues/1672Ensure that javascript urls respect locale they are loaded from2023-02-28T05:03:22ZseamusleeEnsure that javascript urls respect locale they are loaded fromOverview
----------------------------------------
For a particular client to generate a feedback form we were loading in some custom data to show as the fields for the form without using a profile. The issue is that when we were loading ...Overview
----------------------------------------
For a particular client to generate a feedback form we were loading in some custom data to show as the fields for the form without using a profile. The issue is that when we were loading it on the french version of the page all the custom data came out in english, This is because the url used to retrieve the custom data did not have the /fr/ prefix to it
Reproduction steps
----------------------------------------
1. Set your database to be multilingual e.g en_US, fr_FR
1. Create a custom form and ensure that you assign custom field entity_id and entity type values on the form.
1. In your template include the CRM/common/CustomField.tpl.
1. Load the french version of your newly created page and find the custom field labels and options etc are all in English .
Current behaviour
----------------------------------------
Custom value labels are returned using English
Expected behaviour
----------------------------------------
Custom field labels should be in the other language
Environment information
----------------------------------------
* __CiviCRM:__ _5.20_
* __PHP:__ _7.1_
* __CMS:__ _Drupal 8https://lab.civicrm.org/dev/core/-/issues/1605State/province not copied on shared address2023-02-28T05:03:22ZAndie HuntState/province not copied on shared addressThis is a regression as of 5.20.0. When editing one contact to share another contact's address, the state or province is not copied over. This happens whether using the inline form or the main contact edit form.
1. Select the address...This is a regression as of 5.20.0. When editing one contact to share another contact's address, the state or province is not copied over. This happens whether using the inline form or the main contact edit form.
1. Select the address and see that everything's there:
![image](/uploads/713740ed31241b0bb8c698a6590249b8/image.png)
2. Save and see that the state is missing:
![image](/uploads/ecc0eb99c889973db078564a2b1ca02f/image.png)
For reference, when you have a contact Alice with and address and you edit Bob to share Alice's address, a new address entry is created for Bob and filled with Alice's address values plus a `master_id` relating to Alice's address. Later edits to Alice's address will update Bob's.
In the case in the screenshots, searching for contacts in Ijamsville will return both contacts,
![image](/uploads/24d105080c910403dbd65386fef2a192/image.png)
while searching for contacts in Maryland will only return Rebekah:
![image](/uploads/837d35b5826cd190cd53379bfece7355/image.png)
Editing Rebekah's address triggers an update, and that updates both addresses accurately, including the state/province. The problem is specifically in the initial copy when you set up the shared address.https://lab.civicrm.org/dev/backdrop/-/issues/1Convert member and group to roles sync rules from database to config2023-02-27T16:56:29ZherbdoolConvert member and group to roles sync rules from database to configCurrently they're stored in the database but they smell a lot like configuration. Better to store them in the config json files and drop the database tables.Currently they're stored in the database but they smell a lot like configuration. Better to store them in the config json files and drop the database tables.herbdoolherbdoolhttps://lab.civicrm.org/dev/core/-/issues/3901Dedupe rule with custom fields fails to work as Supervised2023-02-27T15:03:26ZpetednzDedupe rule with custom fields fails to work as SupervisedOverview
----------------------------------------
If a Dedupe matching rule is created which contains a custom field, and it is set to be used for Supervised, it fails to function when Add Individual is used, but does identify the duplic...Overview
----------------------------------------
If a Dedupe matching rule is created which contains a custom field, and it is set to be used for Supervised, it fails to function when Add Individual is used, but does identify the duplicate when 'use rule' is run
https://civicrm.stackexchange.com/questions/42264/supervised-dedupe-rule-finds-duplicate-when-manually-run-but-not-automatically?noredirect=1#comment50398_42264
Reproduction steps
----------------------------------------
1. On dmaster add a Rule with Last + Marital Status - set rule to be Supervised.
2. Edit Contact 166 to be 'Single' in Marital Status.
3. Add a new contact with Last = Lee and Marital Status = Single. No duplicate warning is provided
4. Run the Supervised Rule and note that the Duplicate records for Lee are listed
Current behaviour
----------------------------------------
Duplicate warning when creating contact does not show
Expected behaviour
----------------------------------------
Duplicate warning when creating contact does not show
Environment information
----------------------------------------
https://dmaster.demo.civicrm.org/
Comments
----------------------------------------
I saw a few other tickets in here referencing custom fields but they seem to be more nuanced eg
https://lab.civicrm.org/dev/core/-/issues/2300
https://lab.civicrm.org/dev/core/-/issues/2966colemanwcolemanwhttps://lab.civicrm.org/dev/core/-/issues/4070FlexMailer: Default Return Path not respected2023-02-27T13:47:09ZJonGoldFlexMailer: Default Return Path not respectedIn **Administer » CiviMail » Mail Accounts**, you can specify a default return path for your CiviMail mailings. This is important when, for instance, your bounce address's mailhost does not support VERP. This forces the `Return-Path` h...In **Administer » CiviMail » Mail Accounts**, you can specify a default return path for your CiviMail mailings. This is important when, for instance, your bounce address's mailhost does not support VERP. This forces the `Return-Path` header to a specific email address. The bounce processing code will find the `X-CiviMail-Bounce` header and process that instead of the bounce address.
However, this functionality was not ported to Flexmailer. You can see it at the very top of `CRM_Utils_Mail::send()` but not in `Civi\FlexMailer\Listener\BounceTracker::onCompose()`.
This causes the return-path to have the VERP address.JonGoldJonGoldhttps://lab.civicrm.org/dev/core/-/issues/4109New `address_primary` tokens don't work2023-02-27T12:35:41ZJonGoldNew `address_primary` tokens don't workhttps://github.com/civicrm/civicrm-core/pull/25032 introduced a new standard, such that a postal code token should be: `{contact.address_primary.postal_code}`.
There is also what the tests call the "briefly popular" interim format: `{co...https://github.com/civicrm/civicrm-core/pull/25032 introduced a new standard, such that a postal code token should be: `{contact.address_primary.postal_code}`.
There is also what the tests call the "briefly popular" interim format: `{contact.primary_address.postal_code}`.
However, the `address_primary` variant only works if either the corresponding `primary_address` OR legacy token is also present. The tests pass because the legacy tokens and new tokens are tested together.
E.g. this won't render:
```
pa postal: {contact.address_primary.postal_code}
```
But these two will:
```
old postal: {contact.postal_code}
pa postal: {contact.address_primary.postal_code}
```
```
interim postal: {contact.primary_address.postal_code}
pa postal: {contact.address_primary.postal_code}
```5.58.1https://lab.civicrm.org/dev/core/-/issues/667Deleting entities leaves obsolete EntityTag records2023-02-27T05:03:36ZjensschuppeDeleting entities leaves obsolete EntityTag records## Steps to reproduce
* Create a contact
* Assign a tag to the contact
* (Permantently) Delete the contact
## Expected result
The record in `civicrm_entity_tag` for the contact-tag relationship should have been removed.
## Actual res...## Steps to reproduce
* Create a contact
* Assign a tag to the contact
* (Permantently) Delete the contact
## Expected result
The record in `civicrm_entity_tag` for the contact-tag relationship should have been removed.
## Actual result
The record in `civicrm_entitiy_tag` for the contact-tag relationship retains and will never-ever be deleted.
## Technical background
Since a FK constraint `ON DELETE CASCADE` on the `civicrm_entity_tag` table for all possible entity ID tables is not possible, also due to the aggregated identification (`entity_table` and `entity_id`), this should be done in code when deleting any entity that may be assigned a tag.https://lab.civicrm.org/dev/core/-/issues/1658DB Error on Search Builder2023-02-27T05:03:35ZEdselopezDB Error on Search BuilderOverview
----------------------------------------
DB Error encountered when searching for contributions with a certain soft credit type using the search builder
Reproduction steps
----------------------------------------
1. Click on **S...Overview
----------------------------------------
DB Error encountered when searching for contributions with a certain soft credit type using the search builder
Reproduction steps
----------------------------------------
1. Click on **Search -> Search Builder**.
2. Selected **Contribution**, then **Soft Credit Type** and searched for a particular ID.
1. Got an error "**Fatal error: DB error**".
Current behaviour
----------------------------------------
![Screenshot_2020-03-17_at_3.47.42_PM](/uploads/54dadfae6d555d215c5a33fb5ba46246/Screenshot_2020-03-17_at_3.47.42_PM.png)
DB Error here:
https://gist.github.com/Edzelopez/2306b9c797c2ea24af0ef1202ffb2fa8seamusleeseamusleehttps://lab.civicrm.org/dev/core/-/issues/1657Intermittent bug on processing membeships2023-02-26T05:03:39ZeileenIntermittent bug on processing membeshipsI'm opening this to track https://github.com/civicrm/civicrm-core/pull/16811 - as the test demonstrates there is a logic bug in the static for that code. However, we don't know how to replicate this in the wild & it's off my priority lis...I'm opening this to track https://github.com/civicrm/civicrm-core/pull/16811 - as the test demonstrates there is a logic bug in the static for that code. However, we don't know how to replicate this in the wild & it's off my priority list so let's track in gitlab
https://github.com/civicrm/civicrm-core/pull/16811https://lab.civicrm.org/dev/core/-/issues/1644Merge related activities not deleted when permanently deleting a contact2023-02-26T05:03:38ZeileenMerge related activities not deleted when permanently deleting a contactWhen a contact is merged into a another contact the following happens
- the data is moved over
- the merged contact is 'deleted'
- an activity is created of type 'Contact Merged' - source is logged in contact, target is the retained...When a contact is merged into a another contact the following happens
- the data is moved over
- the merged contact is 'deleted'
- an activity is created of type 'Contact Merged' - source is logged in contact, target is the retained contact
- If the merged contact is being deleted to trash an activity is created of type 'Contact Deleted by Merge' - source is logged in contact, target is deleted contact
When we later fully delete the contact deleted-by-merge only activities linked to no other contact are deleted - in other words the 'Contact Deleted by Merge' activity remains, linked to the source contact.
I believe this activity should be deleted on true-death , as it would not be present had they been fully deleted in the first instance
@pfigel @DaveDhttps://lab.civicrm.org/dev/joomla/-/issues/35[Joomla 4.0] Cannot access/set user permissions2023-02-25T12:13:56Znicol[Joomla 4.0] Cannot access/set user permissionsClicking the Joomla access control link (/administrator/index.php?option=com_config&view=component&component=com_civicrm) via either Civi (administrator/?option=com_civicrm&task=civicrm/admin/access&reset=1) or Joomla (administrator/inde...Clicking the Joomla access control link (/administrator/index.php?option=com_config&view=component&component=com_civicrm) via either Civi (administrator/?option=com_civicrm&task=civicrm/admin/access&reset=1) or Joomla (administrator/index.php?option=com_config#page-permissions) gives a fatal error. Without setting ACLs, the front end Civi links won't display - so this looks like a blocker for Joomla 4.0 compatibility.
According to Joomla 4's debugger the issue is:
`Compile Error: require_once(): Failed opening required '/Applications/MAMP/htdocs/Joomla_4.0.2/libraries/joomla/form/fields/rules.php' (include_path='.:/Applications/MAMP/bin/php/php7.3.7/lib/php')`
`
FatalError in /Joomla_4.0.2/administrator/components/com_civicrm/civicrm/joomla/libraries/joomla/form/fields/civiperms.php (line 6)
<?php
defined('JPATH_PLATFORM') or die;
// for some reason Joomla doesn't autoload JFormFieldRules in this context
require_once JPATH_SITE . '/libraries/joomla/form/fields/rules.php';
class JFormFieldCiviperms extends JFormFieldRules {
/**
* @var CRM_Core_Config
`Joomla 4 Integrationseamusleeseamusleehttps://lab.civicrm.org/dev/core/-/issues/1582Display preferences settings "Do not notify assignees for" and "Include ICal ...2023-02-25T05:03:39ZDaveDDisplay preferences settings "Do not notify assignees for" and "Include ICal Invite to Activity Assignees" are only implemented in the form layerI'm unlikely to work on this but logging that these two display preferences are tied to the form layer and only referenced (either directly or indirectly) via CRM/Activity/Form/Activity.php, and so are ignored when using the api.
This i...I'm unlikely to work on this but logging that these two display preferences are tied to the form layer and only referenced (either directly or indirectly) via CRM/Activity/Form/Activity.php, and so are ignored when using the api.
This is not recent. I'm sure it has always been this way.