diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index 3e2c170a5..5a1377cab 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -878,6 +878,8 @@ abstract class InvoiceEntity extends Object if (isPayable && isInvoice) { actions.add(EntityAction.markPaid); + } else if (isCredit && balanceOrAmount > 0) { + //actions.add(EntityAction.markPaid); } if (isPayable && userCompany.canCreate(EntityType.payment)) { diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index 03630beb6..357b36ae0 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -277,6 +277,25 @@ class BulkEmailCreditsFailure implements StopSaving { final dynamic error; } +class MarkCreditsPaidRequest implements StartSaving { + MarkCreditsPaidRequest(this.completer, this.invoiceIds); + + final Completer completer; + final List invoiceIds; +} + +class MarkCreditsPaidSuccess implements StopSaving { + MarkCreditsPaidSuccess(this.invoices); + + final List invoices; +} + +class MarkCreditsPaidFailure implements StopSaving { + MarkCreditsPaidFailure(this.error); + + final dynamic error; +} + class ArchiveCreditsRequest implements StartSaving { ArchiveCreditsRequest(this.completer, this.creditIds); @@ -536,6 +555,15 @@ Future handleCreditAction( ..entityType = EntityType.recurringInvoice ..designId = designId)); break; + case EntityAction.markPaid: + store.dispatch(MarkCreditsPaidRequest( + snackBarCompleter( + context, + credits.length == 1 + ? localization.markedCreditAsPaid + : localization.markedCreditsAsPaid), + creditIds)); + break; case EntityAction.applyCredit: createEntity( context: context, diff --git a/lib/redux/credit/credit_middleware.dart b/lib/redux/credit/credit_middleware.dart index c0d2e456e..ce2ceed4c 100644 --- a/lib/redux/credit/credit_middleware.dart +++ b/lib/redux/credit/credit_middleware.dart @@ -35,6 +35,7 @@ List> createStoreCreditsMiddleware([ final restoreCredit = _restoreCredit(repository); final emailCredit = _emailCredit(repository); final bulkEmailCredits = _bulkEmailCredits(repository); + final markPaidCredit = _markPaidCredit(repository); final markSentCredit = _markSentCredit(repository); final downloadCredits = _downloadCredits(repository); final saveDocument = _saveDocument(repository); @@ -54,6 +55,7 @@ List> createStoreCreditsMiddleware([ TypedMiddleware(emailCredit), TypedMiddleware(bulkEmailCredits), TypedMiddleware(markSentCredit), + TypedMiddleware(markPaidCredit), TypedMiddleware(downloadCredits), TypedMiddleware(saveDocument), ]; @@ -242,6 +244,30 @@ Middleware _markSentCredit(CreditRepository repository) { }; } +Middleware _markPaidCredit(CreditRepository repository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as MarkCreditsPaidRequest; + repository + .bulkAction( + store.state.credentials, action.invoiceIds, EntityAction.markPaid) + .then((invoices) { + store.dispatch(MarkCreditsPaidSuccess(invoices)); + store.dispatch(RefreshData()); + if (action.completer != null) { + action.completer.complete(null); + } + }).catchError((Object error) { + print(error); + store.dispatch(MarkCreditsPaidFailure(error)); + if (action.completer != null) { + action.completer.completeError(error); + } + }); + + next(action); + }; +} + Middleware _emailCredit(CreditRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as EmailCreditRequest; diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 2e0bc4ff6..1d5e025c1 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -16,6 +16,8 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'marked_credit_as_paid': 'Successfully marked credit as paid', + 'marked_credits_as_paid': 'Successfully marked credits as paid', 'wait_for_loading': 'Data loading - please wait for it to complete', 'wait_for_saving': 'Data saving - please wait for it to complete', 'html_preview_warning': @@ -70935,6 +70937,15 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]['wait_for_saving'] ?? _localizedValues['en']['wait_for_saving']; + + String get markedCreditAsPaid => + _localizedValues[localeCode]['marked_credit_as_paid'] ?? + _localizedValues['en']['marked_credit_as_paid']; + + String get markedCreditsAsPaid => + _localizedValues[localeCode]['marked_credits_as_paid'] ?? + _localizedValues['en']['marked_credits_as_paid']; + // STARTER: lang field - do not remove comment String lookup(String key) {