From 15122d1fbeba63bfd61b7060c9a6a49936b9f10b Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 29 Aug 2024 11:15:25 +0300 Subject: [PATCH 1/4] Add new activities --- lib/constants.dart | 3 +++ lib/data/models/entities.dart | 3 +++ lib/utils/i18n.dart | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/lib/constants.dart b/lib/constants.dart index a9f1df8996..27d5999146 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -1140,3 +1140,6 @@ const String kActivityExpenseNotificationSent = '139'; const String kActivityStatementSent = '140'; const String kActivityComment = '141'; const String kActivityQuoteEmailReminder1 = '142'; +const String kActivityAutoBillSuccess = '143'; +const String kActivityAutoBillFailure = '144'; +const String kActivityEInvoiceSuccess = '145'; diff --git a/lib/data/models/entities.dart b/lib/data/models/entities.dart index fdcff456c2..4f3ee82dd7 100644 --- a/lib/data/models/entities.dart +++ b/lib/data/models/entities.dart @@ -826,6 +826,9 @@ abstract class ActivityEntity kActivityEmailReminder3, kActivityEmailReminderEndless, kActivityEmailInvoiceFailed, + kActivityAutoBillSuccess, + kActivityAutoBillFailure, + kActivityEInvoiceSuccess, ].contains(activityTypeId)) { return EntityType.invoice; } else if ([ diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 99334c2e0b..fe7b265b1f 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -18,6 +18,11 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'activity_141': 'User :user entered note :notes', + 'activity_142': 'Quote :number reminder 1 sent', + 'activity_143': 'Auto Bill succeeded for invoice :invoice', + 'activity_144': 'Auto Bill failed for invoice :invoice. :notes', + 'activity_145': 'EInvoice :invoice for :client was e-delivered. :notes', 'ssl_host_override': 'SSL Host Override', 'upload_logo_short': 'Upload Logo', 'show_pdfhtml_on_mobile_help': From fcd5c8bf145837dff28d389eea0ed5948f1f15d5 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 29 Aug 2024 11:55:45 +0300 Subject: [PATCH 2/4] Add payment failed email template --- lib/data/models/entities.dart | 1 + lib/data/models/entities.g.dart | 5 ++ lib/data/models/settings_model.dart | 10 ++++ lib/data/models/settings_model.g.dart | 56 ++++++++++++++++++-- lib/ui/settings/templates_and_reminders.dart | 6 +++ lib/utils/i18n.dart | 1 + 6 files changed, 75 insertions(+), 4 deletions(-) diff --git a/lib/data/models/entities.dart b/lib/data/models/entities.dart index 4f3ee82dd7..ec986f6bc0 100644 --- a/lib/data/models/entities.dart +++ b/lib/data/models/entities.dart @@ -299,6 +299,7 @@ class EmailTemplate extends EnumClass { static const EmailTemplate quote = _$quote_email; static const EmailTemplate payment = _$payment_email; static const EmailTemplate payment_partial = _$payment_partial_email; + static const EmailTemplate payment_failed = _$payment_failed_email; static const EmailTemplate credit = _$credit_email; static const EmailTemplate purchase_order = _$purchase_order; static const EmailTemplate statement = _$statement_email; diff --git a/lib/data/models/entities.g.dart b/lib/data/models/entities.g.dart index 16c7a1878a..8e6ff45732 100644 --- a/lib/data/models/entities.g.dart +++ b/lib/data/models/entities.g.dart @@ -239,6 +239,8 @@ const EmailTemplate _$quote_email = const EmailTemplate._('quote'); const EmailTemplate _$payment_email = const EmailTemplate._('payment'); const EmailTemplate _$payment_partial_email = const EmailTemplate._('payment_partial'); +const EmailTemplate _$payment_failed_email = + const EmailTemplate._('payment_failed'); const EmailTemplate _$credit_email = const EmailTemplate._('credit'); const EmailTemplate _$purchase_order = const EmailTemplate._('purchase_order'); const EmailTemplate _$statement_email = const EmailTemplate._('statement'); @@ -263,6 +265,8 @@ EmailTemplate _$templateValueOf(String name) { return _$payment_email; case 'payment_partial': return _$payment_partial_email; + case 'payment_failed': + return _$payment_failed_email; case 'credit': return _$credit_email; case 'purchase_order': @@ -296,6 +300,7 @@ final BuiltSet _$templateValues = _$quote_email, _$payment_email, _$payment_partial_email, + _$payment_failed_email, _$credit_email, _$purchase_order, _$statement_email, diff --git a/lib/data/models/settings_model.dart b/lib/data/models/settings_model.dart index 644cc59d14..fa3f9d0b4d 100644 --- a/lib/data/models/settings_model.dart +++ b/lib/data/models/settings_model.dart @@ -870,6 +870,12 @@ abstract class SettingsEntity @BuiltValueField(wireName: 'payment_flow') String? get paymentFlow; + @BuiltValueField(wireName: 'email_subject_payment_failed') + String? get emailSubjectPaymentFailed; + + @BuiltValueField(wireName: 'email_template_payment_failed') + String? get emailBodyPaymentFailed; + bool? get taskRoundingEnabled => taskRoundToNearest == null ? null : taskRoundToNearest != 1; @@ -970,6 +976,8 @@ abstract class SettingsEntity return emailSubjectPayment; case EmailTemplate.payment_partial: return emailSubjectPaymentPartial; + case EmailTemplate.payment_failed: + return emailSubjectPaymentFailed; case EmailTemplate.reminder1: return emailSubjectReminder1; case EmailTemplate.reminder2: @@ -1007,6 +1015,8 @@ abstract class SettingsEntity return emailBodyPayment; case EmailTemplate.payment_partial: return emailBodyPaymentPartial; + case EmailTemplate.payment_failed: + return emailBodyPaymentFailed; case EmailTemplate.reminder1: return emailBodyReminder1; case EmailTemplate.reminder2: diff --git a/lib/data/models/settings_model.g.dart b/lib/data/models/settings_model.g.dart index 2cd6541f89..c68e8831ce 100644 --- a/lib/data/models/settings_model.g.dart +++ b/lib/data/models/settings_model.g.dart @@ -1688,6 +1688,20 @@ class _$SettingsEntitySerializer ..add(serializers.serialize(value, specifiedType: const FullType(String))); } + value = object.emailSubjectPaymentFailed; + if (value != null) { + result + ..add('email_subject_payment_failed') + ..add(serializers.serialize(value, + specifiedType: const FullType(String))); + } + value = object.emailBodyPaymentFailed; + if (value != null) { + result + ..add('email_template_payment_failed') + ..add(serializers.serialize(value, + specifiedType: const FullType(String))); + } return result; } @@ -2670,6 +2684,14 @@ class _$SettingsEntitySerializer result.paymentFlow = serializers.deserialize(value, specifiedType: const FullType(String)) as String?; break; + case 'email_subject_payment_failed': + result.emailSubjectPaymentFailed = serializers.deserialize(value, + specifiedType: const FullType(String)) as String?; + break; + case 'email_template_payment_failed': + result.emailBodyPaymentFailed = serializers.deserialize(value, + specifiedType: const FullType(String)) as String?; + break; } } @@ -3229,6 +3251,10 @@ class _$SettingsEntity extends SettingsEntity { final bool? mergeEInvoiceToPdf; @override final String? paymentFlow; + @override + final String? emailSubjectPaymentFailed; + @override + final String? emailBodyPaymentFailed; factory _$SettingsEntity([void Function(SettingsEntityBuilder)? updates]) => (new SettingsEntityBuilder()..update(updates))._build(); @@ -3473,7 +3499,9 @@ class _$SettingsEntity extends SettingsEntity { this.quoteLateFeeAmount1, this.quoteLateFeePercent1, this.mergeEInvoiceToPdf, - this.paymentFlow}) + this.paymentFlow, + this.emailSubjectPaymentFailed, + this.emailBodyPaymentFailed}) : super._(); @override @@ -3732,7 +3760,9 @@ class _$SettingsEntity extends SettingsEntity { quoteLateFeeAmount1 == other.quoteLateFeeAmount1 && quoteLateFeePercent1 == other.quoteLateFeePercent1 && mergeEInvoiceToPdf == other.mergeEInvoiceToPdf && - paymentFlow == other.paymentFlow; + paymentFlow == other.paymentFlow && + emailSubjectPaymentFailed == other.emailSubjectPaymentFailed && + emailBodyPaymentFailed == other.emailBodyPaymentFailed; } int? __hashCode; @@ -3980,6 +4010,8 @@ class _$SettingsEntity extends SettingsEntity { _$hash = $jc(_$hash, quoteLateFeePercent1.hashCode); _$hash = $jc(_$hash, mergeEInvoiceToPdf.hashCode); _$hash = $jc(_$hash, paymentFlow.hashCode); + _$hash = $jc(_$hash, emailSubjectPaymentFailed.hashCode); + _$hash = $jc(_$hash, emailBodyPaymentFailed.hashCode); _$hash = $jf(_$hash); return __hashCode ??= _$hash; } @@ -4231,7 +4263,9 @@ class _$SettingsEntity extends SettingsEntity { ..add('quoteLateFeeAmount1', quoteLateFeeAmount1) ..add('quoteLateFeePercent1', quoteLateFeePercent1) ..add('mergeEInvoiceToPdf', mergeEInvoiceToPdf) - ..add('paymentFlow', paymentFlow)) + ..add('paymentFlow', paymentFlow) + ..add('emailSubjectPaymentFailed', emailSubjectPaymentFailed) + ..add('emailBodyPaymentFailed', emailBodyPaymentFailed)) .toString(); } } @@ -5423,6 +5457,16 @@ class SettingsEntityBuilder String? get paymentFlow => _$this._paymentFlow; set paymentFlow(String? paymentFlow) => _$this._paymentFlow = paymentFlow; + String? _emailSubjectPaymentFailed; + String? get emailSubjectPaymentFailed => _$this._emailSubjectPaymentFailed; + set emailSubjectPaymentFailed(String? emailSubjectPaymentFailed) => + _$this._emailSubjectPaymentFailed = emailSubjectPaymentFailed; + + String? _emailBodyPaymentFailed; + String? get emailBodyPaymentFailed => _$this._emailBodyPaymentFailed; + set emailBodyPaymentFailed(String? emailBodyPaymentFailed) => + _$this._emailBodyPaymentFailed = emailBodyPaymentFailed; + SettingsEntityBuilder(); SettingsEntityBuilder get _$this { @@ -5668,6 +5712,8 @@ class SettingsEntityBuilder _quoteLateFeePercent1 = $v.quoteLateFeePercent1; _mergeEInvoiceToPdf = $v.mergeEInvoiceToPdf; _paymentFlow = $v.paymentFlow; + _emailSubjectPaymentFailed = $v.emailSubjectPaymentFailed; + _emailBodyPaymentFailed = $v.emailBodyPaymentFailed; _$v = null; } return this; @@ -5932,7 +5978,9 @@ class SettingsEntityBuilder quoteLateFeeAmount1: quoteLateFeeAmount1, quoteLateFeePercent1: quoteLateFeePercent1, mergeEInvoiceToPdf: mergeEInvoiceToPdf, - paymentFlow: paymentFlow); + paymentFlow: paymentFlow, + emailSubjectPaymentFailed: emailSubjectPaymentFailed, + emailBodyPaymentFailed: emailBodyPaymentFailed); } catch (_) { late String _$failedField; try { diff --git a/lib/ui/settings/templates_and_reminders.dart b/lib/ui/settings/templates_and_reminders.dart index 89ee2e8d1c..1856ea9087 100644 --- a/lib/ui/settings/templates_and_reminders.dart +++ b/lib/ui/settings/templates_and_reminders.dart @@ -216,6 +216,10 @@ class _TemplatesAndRemindersState extends State settings = settings.rebuild((b) => b ..emailBodyPaymentPartial = body ..emailSubjectPaymentPartial = subject); + } else if (_selectedTemplate == EmailTemplate.payment_failed) { + settings = settings.rebuild((b) => b + ..emailBodyPaymentFailed = body + ..emailSubjectPaymentFailed = subject); } else if (_selectedTemplate == EmailTemplate.reminder1) { settings = settings.rebuild((b) => b ..emailBodyReminder1 = body @@ -373,6 +377,7 @@ class _TemplatesAndRemindersState extends State EmailTemplate.statement, EmailTemplate.payment, EmailTemplate.payment_partial, + EmailTemplate.payment_failed, ].contains(value) && !company.isModuleEnabled(EntityType.invoice)) { return false; @@ -564,6 +569,7 @@ class _TemplatesAndRemindersState extends State showInvoiceAsInvoices: [ EmailTemplate.payment, EmailTemplate.payment_partial, + EmailTemplate.payment_partial, ].contains(template), ), SizedBox(height: 16), diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index fe7b265b1f..c3e19b4741 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -18,6 +18,7 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'payment_failed': 'Payment Failed', 'activity_141': 'User :user entered note :notes', 'activity_142': 'Quote :number reminder 1 sent', 'activity_143': 'Auto Bill succeeded for invoice :invoice', From fa07cb1f017e153a15ddbc9a04840e7981e9e5e2 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 1 Sep 2024 13:36:27 +0300 Subject: [PATCH 3/4] Fix for warning on launch --- lib/main.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 1c66ef0824..af4d9738e3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -114,11 +114,12 @@ class MyHttpOverrides extends HttpOverrides { } void main({bool isTesting = false}) async { + WidgetsFlutterBinding.ensureInitialized(); + final prefs = await SharedPreferences.getInstance(); HttpOverrides.global = MyHttpOverrides(prefs.getString(kSharedPrefHostOverride) ?? ''); - WidgetsFlutterBinding.ensureInitialized(); _registerErrorHandlers(); final ConnectionStatusSingleton connectionStatus = From adf9e59ab788bcf7d026cf16b17f9339cae4fbe6 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 1 Sep 2024 13:46:46 +0300 Subject: [PATCH 4/4] Update version --- .github/workflows/flatpak.yml | 2 +- flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml | 1 + lib/constants.dart | 2 +- pubspec.foss.yaml | 2 +- pubspec.yaml | 2 +- snap/snapcraft.yaml | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml index ade275c2ca..e4f8096fb2 100644 --- a/.github/workflows/flatpak.yml +++ b/.github/workflows/flatpak.yml @@ -86,7 +86,7 @@ jobs: draft: false prerelease: false title: "Latest Release" - automatic_release_tag: "v5.0.163" + automatic_release_tag: "v5.0.164" files: | ${{ github.workspace }}/artifacts/Invoice-Ninja-Archive ${{ github.workspace }}/artifacts/Invoice-Ninja-Hash diff --git a/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml b/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml index 9cac3b21ec..91b1e58b0d 100644 --- a/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml +++ b/flatpak/com.invoiceninja.InvoiceNinja.metainfo.xml @@ -50,6 +50,7 @@ + diff --git a/lib/constants.dart b/lib/constants.dart index 27d5999146..35a2bbe105 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -6,7 +6,7 @@ class Constants { } // TODO remove version once #46609 is fixed -const String kClientVersion = '5.0.163'; +const String kClientVersion = '5.0.164'; const String kMinServerVersion = '5.0.4'; const String kAppName = 'Invoice Ninja'; diff --git a/pubspec.foss.yaml b/pubspec.foss.yaml index e10f94c4a9..29f4473fcd 100644 --- a/pubspec.foss.yaml +++ b/pubspec.foss.yaml @@ -1,6 +1,6 @@ name: invoiceninja_flutter description: Client for Invoice Ninja -version: 5.0.163+163 +version: 5.0.164+164 homepage: https://invoiceninja.com documentation: https://invoiceninja.github.io publish_to: none diff --git a/pubspec.yaml b/pubspec.yaml index 9315b6acd1..8e64e082d1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: invoiceninja_flutter description: Client for Invoice Ninja -version: 5.0.163+163 +version: 5.0.164+164 homepage: https://invoiceninja.com documentation: https://invoiceninja.github.io publish_to: none diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 9b414839b6..b7c7cf020a 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: invoiceninja -version: '5.0.163' +version: '5.0.164' summary: Create invoices, accept payments, track expenses & time tasks description: "### Note: if the app fails to run using `snap run invoiceninja` it may help to run `/snap/invoiceninja/current/bin/invoiceninja` instead