Add approve quote bulk action

This commit is contained in:
Hillel Coren 2022-03-10 15:29:35 +02:00
parent f18c9c1ea3
commit 04e97e5ba4
5 changed files with 72 additions and 0 deletions

View File

@ -901,6 +901,9 @@ abstract class InvoiceEntity extends Object
if (isQuote) { if (isQuote) {
if ((invoiceId ?? '').isEmpty) { if ((invoiceId ?? '').isEmpty) {
if (!isApproved) {
actions.add(EntityAction.approve);
}
actions.add(EntityAction.convertToInvoice); actions.add(EntityAction.convertToInvoice);
} else { } else {
actions.add(EntityAction.viewInvoice); actions.add(EntityAction.viewInvoice);

View File

@ -122,6 +122,10 @@ class EntityAction extends EnumClass {
return 'email'; return 'email';
} }
// else if (value == 'approve') {
// return 'approved';
// }
return value; return value;
} }

View File

@ -428,6 +428,25 @@ class ConvertQuoteFailure implements StopSaving {
final dynamic error; final dynamic error;
} }
class ApproveQuotes implements StartSaving {
ApproveQuotes(this.completer, this.quoteIds);
final List<String> quoteIds;
final Completer completer;
}
class ApproveQuoteSuccess implements StopSaving {
ApproveQuoteSuccess({this.quotes});
final List<InvoiceEntity> quotes;
}
class ApproveQuoteFailure implements StopSaving {
ApproveQuoteFailure(this.error);
final dynamic error;
}
class SaveQuoteDocumentRequest implements StartSaving { class SaveQuoteDocumentRequest implements StartSaving {
SaveQuoteDocumentRequest({ SaveQuoteDocumentRequest({
@required this.completer, @required this.completer,
@ -478,6 +497,15 @@ Future handleQuoteAction(
snackBarCompleter<Null>(context, localization.convertedQuote), snackBarCompleter<Null>(context, localization.convertedQuote),
quoteIds)); quoteIds));
break; break;
case EntityAction.approve:
store.dispatch(ApproveQuotes(
snackBarCompleter<Null>(
context,
quotes.length == 1
? localization.approvedQuote
: localization.approvedQuotes),
quoteIds));
break;
case EntityAction.viewInvoice: case EntityAction.viewInvoice:
viewEntityById(entityId: quote.invoiceId, entityType: EntityType.invoice); viewEntityById(entityId: quote.invoiceId, entityType: EntityType.invoice);
break; break;

View File

@ -28,6 +28,7 @@ List<Middleware<AppState>> createStoreQuotesMiddleware([
final showEmailQuote = _showEmailQuote(); final showEmailQuote = _showEmailQuote();
final showPdfQuote = _showPdfQuote(); final showPdfQuote = _showPdfQuote();
final convertQuote = _convertQuote(repository); final convertQuote = _convertQuote(repository);
final approveQuote = _approveQuote(repository);
final loadQuotes = _loadQuotes(repository); final loadQuotes = _loadQuotes(repository);
final loadQuote = _loadQuote(repository); final loadQuote = _loadQuote(repository);
final saveQuote = _saveQuote(repository); final saveQuote = _saveQuote(repository);
@ -45,6 +46,7 @@ List<Middleware<AppState>> createStoreQuotesMiddleware([
TypedMiddleware<AppState, ViewQuote>(viewQuote), TypedMiddleware<AppState, ViewQuote>(viewQuote),
TypedMiddleware<AppState, EditQuote>(editQuote), TypedMiddleware<AppState, EditQuote>(editQuote),
TypedMiddleware<AppState, ConvertQuotes>(convertQuote), TypedMiddleware<AppState, ConvertQuotes>(convertQuote),
TypedMiddleware<AppState, ApproveQuotes>(approveQuote),
TypedMiddleware<AppState, ShowEmailQuote>(showEmailQuote), TypedMiddleware<AppState, ShowEmailQuote>(showEmailQuote),
TypedMiddleware<AppState, ShowPdfQuote>(showPdfQuote), TypedMiddleware<AppState, ShowPdfQuote>(showPdfQuote),
TypedMiddleware<AppState, LoadQuotes>(loadQuotes), TypedMiddleware<AppState, LoadQuotes>(loadQuotes),
@ -241,6 +243,26 @@ Middleware<AppState> _convertQuote(QuoteRepository repository) {
}; };
} }
Middleware<AppState> _approveQuote(QuoteRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as ApproveQuotes;
repository
.bulkAction(
store.state.credentials, action.quoteIds, EntityAction.approve)
.then((quotes) {
store.dispatch(ApproveQuoteSuccess(quotes: quotes));
store.dispatch(RefreshData());
action.completer.complete(null);
}).catchError((Object error) {
print(error);
store.dispatch(ApproveQuoteFailure(error));
action.completer.completeError(error);
});
next(action);
};
}
Middleware<AppState> _markSentQuote(QuoteRepository repository) { Middleware<AppState> _markSentQuote(QuoteRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) { return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as MarkSentQuotesRequest; final action = dynamicAction as MarkSentQuotesRequest;

View File

@ -16,6 +16,9 @@ mixin LocalizationsProvider on LocaleCodeAware {
static final Map<String, Map<String, String>> _localizedValues = { static final Map<String, Map<String, String>> _localizedValues = {
'en': { 'en': {
// STARTER: lang key - do not remove comment // STARTER: lang key - do not remove comment
'approved_quote': 'Successfully apporved quote',
'approved_quotes': 'Successfully approved quotes',
'approve': 'Approve',
'client_website': 'Client Website', 'client_website': 'Client Website',
'invalid_time': 'Invalid Time', 'invalid_time': 'Invalid Time',
'client_shipping_state': 'Client Shipping State', 'client_shipping_state': 'Client Shipping State',
@ -74135,6 +74138,18 @@ mixin LocalizationsProvider on LocaleCodeAware {
_localizedValues[localeCode]['client_website'] ?? _localizedValues[localeCode]['client_website'] ??
_localizedValues['en']['client_website']; _localizedValues['en']['client_website'];
String get approve =>
_localizedValues[localeCode]['approve'] ??
_localizedValues['en']['approve'];
String get approvedQuote =>
_localizedValues[localeCode]['approved_quote'] ??
_localizedValues['en']['approved_quote'];
String get approvedQuotes =>
_localizedValues[localeCode]['approved_quotes'] ??
_localizedValues['en']['approved_quotes'];
// STARTER: lang field - do not remove comment // STARTER: lang field - do not remove comment
String lookup(String key) { String lookup(String key) {