From 65b7d1aa49bbe6522af2c53b8e64a3c63f436cc8 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 30 May 2023 17:23:54 +0300 Subject: [PATCH] Choose template to use when emailing multiple invoices at once #472 --- lib/data/repositories/credit_repository.dart | 9 +++++++-- lib/data/repositories/invoice_repository.dart | 9 +++++++-- .../repositories/purchase_order_repository.dart | 9 +++++++-- lib/data/repositories/quote_repository.dart | 9 +++++++-- lib/redux/credit/credit_actions.dart | 16 +++++++++------- lib/redux/invoice/invoice_actions.dart | 16 +++++++++------- .../purchase_order/purchase_order_actions.dart | 17 ++++++++++------- lib/redux/quote/quote_actions.dart | 7 ++++--- 8 files changed, 60 insertions(+), 32 deletions(-) diff --git a/lib/data/repositories/credit_repository.dart b/lib/data/repositories/credit_repository.dart index ff82f5168..e52470b58 100644 --- a/lib/data/repositories/credit_repository.dart +++ b/lib/data/repositories/credit_repository.dart @@ -55,7 +55,8 @@ class CreditRepository { } Future> bulkAction( - Credentials credentials, List ids, EntityAction action) async { + Credentials credentials, List ids, EntityAction action, + {EmailTemplate template}) async { if (ids.length > kMaxEntitiesPerBulkAction && action.applyMaxLimit) { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } @@ -63,7 +64,11 @@ class CreditRepository { final url = credentials.url + '/credits/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': action.toApiParam()})); + data: json.encode({ + 'ids': ids, + 'action': action.toApiParam(), + if (template != null) 'email_type': 'email_template_$template', + })); final InvoiceListResponse invoiceResponse = serializers.deserializeWith(InvoiceListResponse.serializer, response); diff --git a/lib/data/repositories/invoice_repository.dart b/lib/data/repositories/invoice_repository.dart index 453c614ba..657c10f01 100644 --- a/lib/data/repositories/invoice_repository.dart +++ b/lib/data/repositories/invoice_repository.dart @@ -56,7 +56,8 @@ class InvoiceRepository { } Future> bulkAction( - Credentials credentials, List ids, EntityAction action) async { + Credentials credentials, List ids, EntityAction action, + {EmailTemplate template}) async { if (ids.length > kMaxEntitiesPerBulkAction && action.applyMaxLimit) { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } @@ -64,7 +65,11 @@ class InvoiceRepository { final url = credentials.url + '/invoices/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': action.toApiParam()})); + data: json.encode({ + 'ids': ids, + 'action': action.toApiParam(), + if (template != null) 'email_type': 'email_template_$template', + })); final InvoiceListResponse invoiceResponse = serializers.deserializeWith(InvoiceListResponse.serializer, response); diff --git a/lib/data/repositories/purchase_order_repository.dart b/lib/data/repositories/purchase_order_repository.dart index c1e52b823..f5269cfca 100644 --- a/lib/data/repositories/purchase_order_repository.dart +++ b/lib/data/repositories/purchase_order_repository.dart @@ -50,7 +50,8 @@ class PurchaseOrderRepository { } Future> bulkAction( - Credentials credentials, List ids, EntityAction action) async { + Credentials credentials, List ids, EntityAction action, + {EmailTemplate template}) async { if (ids.length > kMaxEntitiesPerBulkAction && action.applyMaxLimit) { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } @@ -58,7 +59,11 @@ class PurchaseOrderRepository { final url = credentials.url + '/purchase_orders/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': action.toApiParam()})); + data: json.encode({ + 'ids': ids, + 'action': action.toApiParam(), + if (template != null) 'email_type': 'email_template_$template', + })); print( '## DATA: ${json.encode({'ids': ids, 'action': action.toApiParam()})}'); diff --git a/lib/data/repositories/quote_repository.dart b/lib/data/repositories/quote_repository.dart index b32ea186e..3dcd8658b 100644 --- a/lib/data/repositories/quote_repository.dart +++ b/lib/data/repositories/quote_repository.dart @@ -56,7 +56,8 @@ class QuoteRepository { } Future> bulkAction( - Credentials credentials, List ids, EntityAction action) async { + Credentials credentials, List ids, EntityAction action, + {EmailTemplate template}) async { if (ids.length > kMaxEntitiesPerBulkAction && action.applyMaxLimit) { ids = ids.sublist(0, kMaxEntitiesPerBulkAction); } @@ -64,7 +65,11 @@ class QuoteRepository { final url = credentials.url + '/quotes/bulk?per_page=$kMaxEntitiesPerBulkAction'; final dynamic response = await webClient.post(url, credentials.token, - data: json.encode({'ids': ids, 'action': action.toApiParam()})); + data: json.encode({ + 'ids': ids, + 'action': action.toApiParam(), + if (template != null) 'email_type': 'email_template_$template', + })); final InvoiceListResponse invoiceResponse = serializers.deserializeWith(InvoiceListResponse.serializer, response); diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index e0e991842..e4ba5ffe6 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -273,10 +273,11 @@ class MarkSentCreditFailure implements StopSaving { } class BulkEmailCreditsRequest implements StartSaving { - BulkEmailCreditsRequest(this.completer, this.creditIds); + BulkEmailCreditsRequest({this.completer, this.creditIds, this.template}); final Completer completer; final List creditIds; + final EmailTemplate template; } class BulkEmailCreditsSuccess implements StopSaving, PersistData { @@ -548,12 +549,13 @@ Future handleCreditAction( message: localization.bulkEmailCredits, callback: (_) { store.dispatch(BulkEmailCreditsRequest( - snackBarCompleter( - context, - creditIds.length == 1 - ? localization.emailedCredit - : localization.emailedCredits), - creditIds)); + completer: snackBarCompleter( + context, + creditIds.length == 1 + ? localization.emailedCredit + : localization.emailedCredits), + creditIds: creditIds, + )); }); } break; diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index 017d02fba..c43d52580 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -279,10 +279,11 @@ class MarkInvoicesSentFailure implements StopSaving { } class BulkEmailInvoicesRequest implements StartSaving { - BulkEmailInvoicesRequest(this.completer, this.invoiceIds); + BulkEmailInvoicesRequest({this.completer, this.invoiceIds, this.template}); final Completer completer; final List invoiceIds; + final EmailTemplate template; } class BulkEmailInvoicesSuccess implements StopSaving, PersistData { @@ -668,12 +669,13 @@ void handleInvoiceAction(BuildContext context, List invoices, message: localization.bulkEmailInvoices, callback: (_) { store.dispatch(BulkEmailInvoicesRequest( - snackBarCompleter( - context, - invoiceIds.length == 1 - ? localization.emailedInvoice - : localization.emailedInvoices), - invoiceIds)); + completer: snackBarCompleter( + context, + invoiceIds.length == 1 + ? localization.emailedInvoice + : localization.emailedInvoices), + invoiceIds: invoiceIds, + )); }); } break; diff --git a/lib/redux/purchase_order/purchase_order_actions.dart b/lib/redux/purchase_order/purchase_order_actions.dart index 4201d7cd8..4e7dc35ff 100644 --- a/lib/redux/purchase_order/purchase_order_actions.dart +++ b/lib/redux/purchase_order/purchase_order_actions.dart @@ -209,10 +209,12 @@ class SavePurchaseOrderFailure implements StopSaving { } class BulkEmailPurchaseOrdersRequest implements StartSaving { - BulkEmailPurchaseOrdersRequest(this.completer, this.purchaseOrderIds); + BulkEmailPurchaseOrdersRequest( + {this.completer, this.purchaseOrderIds, this.template}); final Completer completer; final List purchaseOrderIds; + final EmailTemplate template; } class BulkEmailPurchaseOrdersSuccess implements StopSaving, PersistData { @@ -761,12 +763,13 @@ void handlePurchaseOrderAction(BuildContext context, message: localization.bulkEmailPurchaseOrders, callback: (_) { store.dispatch(BulkEmailPurchaseOrdersRequest( - snackBarCompleter( - context, - purchaseOrderIds.length == 1 - ? localization.emailedPurchaseOrder - : localization.emailedPurchaseOrders), - purchaseOrderIds)); + completer: snackBarCompleter( + context, + purchaseOrderIds.length == 1 + ? localization.emailedPurchaseOrder + : localization.emailedPurchaseOrders), + purchaseOrderIds: purchaseOrderIds, + )); }); } break; diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index 0f21ed2aa..1614c0494 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -278,10 +278,11 @@ class MarkSentQuoteFailure implements StopSaving { } class BulkEmailQuotesRequest implements StartSaving { - BulkEmailQuotesRequest(this.completer, this.quoteIds); + BulkEmailQuotesRequest({this.completer, this.quoteIds, this.template}); final Completer completer; final List quoteIds; + final EmailTemplate template; } class BulkEmailQuotesSuccess implements StopSaving, PersistData { @@ -622,12 +623,12 @@ Future handleQuoteAction( message: localization.bulkEmailQuotes, callback: (_) { store.dispatch(BulkEmailQuotesRequest( - snackBarCompleter( + completer: snackBarCompleter( context, quoteIds.length == 1 ? localization.emailedQuote : localization.emailedQuotes), - quoteIds)); + quoteIds: quoteIds)); }); } break;