Purchase orders

This commit is contained in:
Hillel Coren 2022-06-23 12:27:35 +03:00
parent 5643c981e2
commit be5d35d5c4
4 changed files with 82 additions and 7 deletions

View File

@ -483,8 +483,10 @@ Future handleCreditAction(
case EntityAction.emailCredit: case EntityAction.emailCredit:
case EntityAction.bulkEmailCredit: case EntityAction.bulkEmailCredit:
bool emailValid = true; bool emailValid = true;
creditIds.forEach((element) { credits.forEach((credit) {
final client = state.clientState.get(credit.clientId); final client = state.clientState.get(
(credit as InvoiceEntity).clientId,
);
if (!client.hasEmailAddress) { if (!client.hasEmailAddress) {
emailValid = false; emailValid = false;
} }

View File

@ -569,8 +569,10 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
case EntityAction.emailInvoice: case EntityAction.emailInvoice:
case EntityAction.bulkEmailInvoice: case EntityAction.bulkEmailInvoice:
bool emailValid = true; bool emailValid = true;
invoiceIds.forEach((element) { invoices.forEach((invoice) {
final client = state.clientState.get(invoice.clientId); final client = state.clientState.get(
(invoice as InvoiceEntity).clientId,
);
if (!client.hasEmailAddress) { if (!client.hasEmailAddress) {
emailValid = false; emailValid = false;
} }

View File

@ -1,11 +1,12 @@
import 'dart:async'; import 'dart:async';
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/dialogs.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
@ -172,6 +173,25 @@ class SavePurchaseOrderFailure implements StopSaving {
final Object error; final Object error;
} }
class BulkEmailPurchaseOrdersRequest implements StartSaving {
BulkEmailPurchaseOrdersRequest(this.completer, this.purchaseOrderIds);
final Completer completer;
final List<String> purchaseOrderIds;
}
class BulkEmailPurchaseOrdersSuccess implements StopSaving, PersistData {
BulkEmailPurchaseOrdersSuccess(this.purchaseOrders);
final List<InvoiceEntity> purchaseOrders;
}
class BulkEmailPurchaseOrdersFailure implements StopSaving {
BulkEmailPurchaseOrdersFailure(this.error);
final dynamic error;
}
class ArchivePurchaseOrdersRequest implements StartSaving { class ArchivePurchaseOrdersRequest implements StartSaving {
ArchivePurchaseOrdersRequest(this.completer, this.purchaseOrderIds); ArchivePurchaseOrdersRequest(this.completer, this.purchaseOrderIds);
@ -429,6 +449,7 @@ void handlePurchaseOrderAction(BuildContext context,
} }
final store = StoreProvider.of<AppState>(context); final store = StoreProvider.of<AppState>(context);
final state = store.state;
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final purchaseOrder = purchaseOrders.first as InvoiceEntity; final purchaseOrder = purchaseOrders.first as InvoiceEntity;
final purchaseOrderIds = final purchaseOrderIds =
@ -480,6 +501,54 @@ void handlePurchaseOrderAction(BuildContext context,
} }
} }
break; break;
case EntityAction.emailPurchaseOrder:
case EntityAction.bulkEmailPurchaseOrder:
bool emailValid = true;
purchaseOrders.forEach((purchaseOrder) {
final client = state.clientState.get(
(purchaseOrder as InvoiceEntity).clientId,
);
if (!client.hasEmailAddress) {
emailValid = false;
}
});
if (!emailValid) {
showMessageDialog(
context: context,
message: localization.clientEmailNotSet,
secondaryActions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
editEntity(
entity: state.clientState.get(purchaseOrder.clientId));
},
child: Text(localization.editClient.toUpperCase()))
]);
return;
}
if (action == EntityAction.emailQuote) {
store.dispatch(ShowEmailPurchaseOrder(
completer: snackBarCompleter<Null>(
context, localization.emailedPurchaseOrder),
purchaseOrder: purchaseOrder,
context: context));
} else {
confirmCallback(
context: context,
message: localization.bulkEmailQuote,
callback: (_) {
store.dispatch(BulkEmailPurchaseOrdersRequest(
snackBarCompleter<Null>(
context,
purchaseOrderIds.length == 1
? localization.emailedPurchaseOrder
: localization.emailedPurchaseOrders),
purchaseOrderIds));
});
}
break;
case EntityAction.more: case EntityAction.more:
showEntityActionsDialog( showEntityActionsDialog(
entities: [purchaseOrder], entities: [purchaseOrder],

View File

@ -522,8 +522,10 @@ Future handleQuoteAction(
case EntityAction.emailQuote: case EntityAction.emailQuote:
case EntityAction.bulkEmailQuote: case EntityAction.bulkEmailQuote:
bool emailValid = true; bool emailValid = true;
quoteIds.forEach((element) { quotes.forEach((quote) {
final client = state.clientState.get(quote.clientId); final client = state.clientState.get(
(quote as InvoiceEntity).clientId,
);
if (!client.hasEmailAddress) { if (!client.hasEmailAddress) {
emailValid = false; emailValid = false;
} }