- Added handling of non-unique
snippets.identifier when adding new or updating existing snippet. remp/crm#3754
- IMPORTANT: Upgraded underlying
tomaj/nette-api library to v3. remp/crm#3751
- Fixed crashing log redaction with a specific JSON payload. remp/crm#3684
- Fixed errors reported by PHPStan (
match.unhandled). remp/crm#3759
- Fixed problematic subscription type matching for
BILLING_RECOVERY subtype notifications. remp/crm#3747
- BREAKING: Upgraded
nette/security to 3.2+. remp/crm#3728
Nette\Security\User::login() no longer accepts a credential array. Wrap credentials in LoginCredentials instead. E.g. in presenters, change $this->getUser()->login([...]) to $this->getUser()->login(new LoginCredentials([...])).
UserAuthenticator no longer implements Nette\Security\Authenticator. Use the new NetteAuthenticatorBridge for Nette-level authentication.
- BREAKING: Updated underlying symfony packages to v7.
- If you write your own commands, please check changes for
symfony/console package: https://github.com/symfony/symfony/blob/7.0/UPGRADE-7.0.md#Console
- BREAKING: Upgraded underlying
predis/predis package from v1 to v3. remp/crm#3748
- If you use Redis client, consult the breaking changes with
predis/predis.
- BREAKING: Changed
FrontendPresenter autologin token processing and FrontendRequestEvent emission to run in startup() instead of beforeRender(). remp/helpdesk#4384
- Autologin from email links and
n_token cookie now works correctly for presenter action methods that require authentication.
- BREAKING: Removed deprecated
Request::getDomain method. remp/crm#3635
- BREAKING: Changed constructor signature of
Crm\ApplicationModule\Models\Database\Repository.
- Parameter
Storage $cacheStorage = null is now explicitly nullable as ?Storage $cacheStorage = null. Any child class needs to update this as well.
- BREAKING: Removed deprecated method
SnippetsRepository#loadAllByIdentifier(). remp/crm#3754, remp/crm#3029
- This was deprecated in v3.2. Use
Crm\ApplicationModule\Repositories\SnippetsRepository#loadByIdentifier() instead.
- BREAKING: Added unique index to column
snippets.identifier. remp/crm#3754, remp/crm#3029
- Migration doesn’t handle multiple snippets with same identifiers and it will fail in identifiers are not unique. This needs to be handled manually before running migration.
- BREAKING: Removed deprecated method
ConfigsRepository#loadAllAutoload(). remp/crm#3754, remp/crm#2605
- This method and flag
configs.autoload were deprecated in v3.3. Use Crm\ApplicationModule\Repositories\ConfigsRepository#all() instead.
- BREAKING: Removed column
configs.autoload. remp/crm#3754, remp/crm#2605
- Also removed method
Crm\ApplicationModule\ConfigBuilder#setAutoload() which set this flag.
- Added option to register
onAnchor callbacks for widgets in LazyWidgetManager.
- Application doesn’t use this directly, but it’s being added for external modules to attach to - primarily Sentry tracing to track widget use.
- Added new countries to the list of countries (Bermuda, Myanmar, Reunion, Cayman Islands, Isle of Man, Virgin Islands, Guadeloupe, Greenland). remp/crm#3256
- Fixed symfony/console deprecation when registering CRM commands.
- Updated underlying
tomaj/hermes messaging library to v5. remp/crm#3750
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse, ternary.alwaysTrue). remp/crm#3759
- Remove redundant
$payment check from SubscriptionTransferInformationWidget. remp/crm#3759
- Fixed missing
null in type hint of Crm\ApplicationModule\UI\Form#getComponent(). remp/crm#3759
- Fixed bug in
RecurrentPaymentPaymentItemContainerDataProvider which caused copying parent payment items even for recurrent payments with next_subscription_type_id. remp/crm#3684
- Added automatic synchronization of family request activations and cancellations to next subscription in renewal chain. remp/crm#3616
- Added
FamilyRequestActivationSyncHandler event handler.
- Added
FamilyRequestDeactivationSyncHandler event handler.
- Added
FamilyRequestCanceledEvent event.
- Added preliminary support for on-demand generation of family requests.
- Improved support for external module connection to FamilyRequestForm.
- Fixed incorrect handling of unclaimed users in the form to activate child subscription. remp/helpdesk#4451
- BREAKING: Changed
ActivatePurchasedGiftCouponsCommand to not change order status depending on gift coupon activation. remp/novydenik#1553
- Order can have multiple products and we don’t want to mark order as delivered without any check.
- Check and order status change is moved to InternalModule.
- Fixed handling of refunded gift payment - gifted subscription is now stopped. remp/helpdesk#4464
- Added vat value to
GiftPaymentItemsListWidget widget template. remp/helpdesk#4504
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse). remp/crm#3759
- BREAKING: Renamed
modified_at column to updated_at in google_play_billing_developer_notifications table. remp/crm#3047
- Fixed errors reported by PHPStan (
booleanAnd.leftAlwaysTrue, booleanNot.alwaysFalse, ternary.alwaysTrue). remp/crm#3759
[FileManagerModule]
- BREAKING: Removed
ListAdminUserProviderInterface. remp/crm#3658
- Use
FileOwnerProviderInterface and FileMetadataProviderInterface instead.
- Register providers under
filemanager.dataprovider.file_owner and filemanager.dataprovider.file_metadata keys.
- Added user ownership tracking for uploaded files. Modules should implement
FileOwnerProviderInterface to resolve file owners. remp/crm#3658
- Added
user_id column to filemanager_uploads table with foreign key to users. remp/crm#3658
- Added
FileOwnerProviderInterface for resolving file ownership. remp/crm#3658
- Added
FileMetadataProviderInterface for providing file metadata. remp/crm#3658
- Changed
ListAdminPresenter to use new FileOwnerProviderInterface for user resolution. remp/crm#3658
- Added user filter to file manager admin. remp/crm#3658
- Changed
filemanager:delete_unassigned_files to use user_id column directly. remp/crm#3658
- Added
filemanager:backfill-user-id command to populate user_id for existing files. remp/crm#3658
- Added cleanup function to remove orphaned files (no
user_id) older than 90 days. remp/crm#3658
- Added
FileManagerUserDataProvider for GDPR user data deletion. remp/crm#3658
- Added
user_id column to filemanager_uploads table with foreign key to users. remp/crm#3658
- Added
FileOwnerProviderInterface for resolving file ownership. remp/crm#3658
- Added
FileMetadataProviderInterface for providing file metadata. remp/crm#3658
- BREAKING: Removed deprecated parameter
invoiceNumber from InvoicesRepository::add method. remp/crm#2804
- IMPORTANT: Upgraded underlying
contributte/pdf library to v8.
- Added
InvoiceQRCodeInterface for instance-specific QR code generation on proforma invoices. remp/crm#3637
- Added
BillingDataProviderInterface to support invoices generated by external payment gateways.
- Added invoice number filter to payments admin listing. remp/crm#3726
- Added invoice number search to universal search. remp/crm#3726
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse). remp/crm#3759
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse). remp/crm#3759
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse). remp/crm#3759
- BREAKING: Replaced library to fetch IMAP contents of confirmation emails. remp/crm#3737
- If you used
Tomaj\ImapMailDownloader\MailCriteria, replace it with Crm\PaymentsModule\Models\MailConfirmation\MailCriteria.
- If you used
use Tomaj\ImapMailDownloader\Downloader, replace it with Crm\PaymentsModule\Models\MailConfirmation\ImapClient.
- Returned
body is now either text version of email (if it’s not empty) or HTML version of email. Original implementation returned raw body.
- The type of attachments is now
Crm\PaymentsModule\Models\MailConfirmation\ImapAttachment. Verify your usage if you rely on attachments.
- BREAKING: Renamed
modified_at column to updated_at in payments and payment_gateways tables. remp/crm#3047
- Added composite index for
status and amount columns to improve speed of DB sums.
- Added ability to set
pause_at date while pausing active subscription. remp/novydenik#1532
- Changed sorting of recurrent payments in user detail in admin.
- Recurrent payments are now sorted by charge date instead of ID which could be counterintuitive for imported records.
- Fixed empty payment listing in the customer area.
- Added graceful handling if module works with gateway which is not registered anymore.
- Added the storing of IP address during the begin of CSOB One Click payments. remp/respekt#471
- Changed recurrent payment amount resolver. If the active recurrent payment already has payment attached, resolver returns amount from the attached payment. remp/crm#3720
- Added migration to change
recurrent_payments.note column type from varchar(255) to varchar(1000). remp/helpdesk#4459
- Fixed possible double timezone specification in some date format. remp/crm#3738
- Added numeric scenario condition for recurrent payment cycle. remp/crm#3718
- Added migration to change
payment_meta.value column type from varchar(255) to varchar(500). remp/helpdesk#4497
- Fixed possible error caused by payment method duplication attempt during subscription transfer if the payment method already existed on the target user. remp/helpdesk#4506
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse, booleanNot.alwaysTrue). remp/crm#3759
- Added
ProductHasTagCriteria scenario condition to filter payments by product tags. remp/crm#3690
- BREAKING: Renamed
modified_at column to updated_at in products table. remp/crm#3047
- Fixed errors reported by PHPStan (
booleanAnd.leftAlwaysTrue). remp/crm#3759
- Added chunking support to
remp-mailer:subscribe-segment-to-mail-type command to handle large segments. remp/crm#3655
- Fixed errors reported by PHPStan (
booleanAnd.leftAlwaysTrue). remp/crm#3759
- Fixed errors reported by PHPStan (
booleanAnd.leftAlwaysTrue). remp/crm#3759
[ReportsModule]
- Added backend for generating and storing weekly reports. remp/crm#3509
- Added
reports:calculate command to calculate and store weekly reports.
- Added
report_values table and corresponding ReportValuesRepository.
- Added new
ReportGroupInterface, ReportSegmentInterface and ReportQueryInterface contracts.
- Added new
UsersWithActivePaidSubscriptionReportGroup report group and needed report segments.
- BREAKING: Removed deprecated method
SalesFunnelEvent#getDeviceType(). remp/crm#3757, remp/helpdesk#2667
- This was deprecated in v3.2.
- Use
Crm\SalesFunnelModule\Events\SalesFunnelEvent#getUserAgent() instead and parse device type with Crm\UsersModule\Models\DeviceDetector which utilizes Redis cache. Use methods setUserAgent() and parse().
- Fixed repeated queries when loading snippets for sales funnels. remp/crm#3687
- Fixed conditions in
SalesFunnelFrontendPresenter ‘s methods validateSubscriptionType() and validateGateway to properly check if subscription type or payment gateway belong to sales funnel. remp/crm#3759
- Fixed errors reported by PHPStan (
booleanAnd.alwaysFalse, booleanAnd.leftAlwaysFalse, booleanAnd.leftAlwaysTrue). remp/crm#3759
- Added new scenario criteria
PaymentIsFromTagSalesFunnelCriteria. remp/crm#3761
- BREAKING: Renamed
modified_at column to updated_at in scenarios table. remp/crm#3047
- Changed JS build tool from
webpack to vite, upgraded old and deprecated JS dependencies. remp/crm#3662
- Added trigger for “user confirmed” event.
- Fixed deleting copied nodes in scenario builder. remp/crm#3689
- Fixed A/B test node copying and scenario duplication to create new segments instead of reusing original ones. remp/crm#3689
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse, match.unhandled). remp/crm#3759
[SegmentsModule]
- IMPORTANT: Added migration that changes
modified_at string to updated_at in all segments. remp/crm#3047
- We standardized column naming to
updated_at across whole project because of inconsistency.
- Changed
SegmentsTrait to allow seeding version 2 segments. remp/crm#3691
- Fixed undefined variable
$count in DashboardSegmentValueBaseWidget when segment doesn’t exist. remp/crm#3692
- Changed
dashboard_segment_value_widget template used by segment widgets on dashboard to move tooltip from top to bottom. remp/crm#3695
- Reason: Longer text in tooltip causes tooltip to be too high and part of it is not visible.
- Fixed validation in
BaseParam#setData() (missing ->isOk() call above Validation object). remp/crm#3759
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse). remp/crm#3759
[SentryModule]
- Added new module to support tracking of CRM internals (initially widgets) within Sentry traces.
- BREAKING: Updated implementation against the latest Clover API (https://docs.stripe.com/changelog/clover).
- Make sure to update your API version in the Stripe Workbench overview.
- BREAKING: Renamed payment meta keys
payment_method_id to stripe_payment_method_id, and payment_intent_id to stripe_payment_intent_id.
- If you reference these, update your implementation and use constants from the
Crm\StripeModule\Models\PaymentMeta instead.
- Existing DB values are migrated automatically.
- BREAKING: Renamed user meta key
stripe_customer to stripe_customer_id.
- If you reference it, update your implementation and use constant from the
Crm\StripeModule\Models\UserMeta instead.
- Existing DB values are migrated automatically.
- Added twig variable `` for sales funnels.
- Added implementation of
BillingDataProviderInterface to make Stripe invoices available within CRM.
- Added support for Stripe webhooks (
/api/v1/stripe/webhook), should be used with Stripe Billing to process the changes.
- Currently webhooks respond to
invoice.paid, checkout.session.completed, customer.subscription.deleted.
- Added
plain layout to enable override checkout pages visual.
- Fixed errors reported by PHPStan (
booleanNot.alwaysFalse). remp/crm#3759
- Fixed method
StripeBillingRecurrent#isValid() tu return false if Subscription is not received. remp/crm#3759
- BREAKING: Renamed
modified_at column to updated_at in subscriptions and subscription_types tables. remp/crm#3047
- BREAKING: Renamed
BaseActiveSubscriptionCriteria to BaseWithSubscriptionCriteria, ActiveSubscriptionCriteria to WithSubscriptionCriteria, and UserActiveSubscriptionCriteria to UserWithSubscriptionCriteria. remp/helpdesk#4486
- The label was misleading — it implied only currently active subscriptions, but the criteria matches all subscriptions regardless of time.
- BREAKING: Renamed segment criteria registration keys
users_active_subscription to users_with_subscription and subscriptions_active_subscription to subscriptions_with_subscription. remp/helpdesk#4486
- BREAKING: Removed deprecated method
SubscriptionTypesRepository#getPrintSubscriptionTypes(). remp/crm#3754, remp/crm#2875
- This was deprecated in v2.7. Use
Crm\SubscriptionsModule\Repository\ContentAccessRepository#hasAccess('print') instead.
- Added
SubscriptionTypeHasTagCriteria scenario condition to filter subscription_types tags. remp/crm#3690
- Added
subscription_type_tags parameter to BaseWithSubscriptionCriteria to filter active subscriptions by subscription type tags in segments. remp/helpdesk#4391
- Added
exists() into SubscriptionTypeTagsRepository. remp/crm#3730
- Added ability to restore expired trial subscriptions from admin. remp/crm#3627
- Added
TrialUpgrade::restore() method to restore expired trials.
- Added
RestoreTrialWidget component for subscription actions menu.
- Fixed
TrialUpgrade::isUsable() returning false after a trial subscription was restored. remp/crm#3627
- Changed
TrialUpgrade - provide whole upgrade config to BeforeResolveSubscriptionTypeEvent. remp/crm#3730
- Fixed direct subscription type upgrades for non-matching subscription type lengths. remp/helpdesk#4522
- Previously, some upgrade options may have been skipped if subscription types lengths were not exactly matching (e.g. 31 to 28 days)
- BREAKING: Removed deprecated method
AddressesRepository#addressesSelect(). remp/crm#3754, remp/respekt#245
- This was deprecated in v3.4. You can use one of the following:
- Methods
getAllPairs() or getAllIsoPairs() from Crm\ApplicationModule\Forms\Controls\CountriesSelectItemsBuilder.
- Or
Crm\UsersModule\Forms\Controls\AddressesSelectItemsBuilder#buildSimpleWithTypes() (which is closer to original implementation).
- BREAKING: Renamed
modified_at column to updated_at in users table. remp/crm#3047
- Added validation to prevent inactive users from logging in via Google and Apple SSO. remp/crm#3681
- Changed default length of generated password to 16 characters.
- Added emitting of new hermes message
user-confirmed when user’s account is confirmed (see usages UserManager::confirmUser()). remp/crm#3694
- Changed redirect route after sign out to use the configured route instead of
:Users:Sign:in.
- Fixed
/api/v2/users/email generating wrong_pass login attempt even when password wasn’t provided. remp/crm#3698
- Upgraded
firebase/php-jwt dependency to version ^7.0.2. remp/crm#3722
- Added option to save address without creating a new address change request version. remp/respekt#474
- Added
AddressChangeRequestsRepository::updateWithoutNewVersion() method.
- Toggled via
AddressFormFactory::allowSaveWithoutVersion() setter in DI config.
- Fixed authentification call in
UserDeleteFormFactory form. remp/helpdesk#4500
- Fixed errors reported by PHPStan (
booleanAnd.leftAlwaysTrue, booleanNot.alwaysFalse). remp/crm#3759
- Changed
BasicUserDataProvider::delete() to set user’s role to user during anonymization, ensuring admin role is revoked. remp/crm#3643