diff --git a/lib/redux/expense/expense_actions.dart b/lib/redux/expense/expense_actions.dart index 6d93656f1..f1d2107a6 100644 --- a/lib/redux/expense/expense_actions.dart +++ b/lib/redux/expense/expense_actions.dart @@ -245,7 +245,6 @@ void handleExpenseAction( BuildContext context, List expenses, EntityAction action) { final store = StoreProvider.of(context); final state = store.state; - final CompanyEntity company = state.company; final localization = AppLocalization.of(context); final expense = expenses.first as ExpenseEntity; final expenseIds = expenses.map((expense) => expense.id).toList(); @@ -277,8 +276,7 @@ void handleExpenseAction( }) .map((expense) => convertExpenseToInvoiceItem( expense: expense, - categoryMap: state.expenseCategoryState.map, - company: company, + context: context, )) .toList(); if (items.isNotEmpty) { diff --git a/lib/redux/expense/expense_selectors.dart b/lib/redux/expense/expense_selectors.dart index 97eab6e9e..ef7567210 100644 --- a/lib/redux/expense/expense_selectors.dart +++ b/lib/redux/expense/expense_selectors.dart @@ -1,4 +1,6 @@ import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:memoize/memoize.dart'; @@ -8,9 +10,12 @@ import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; InvoiceItemEntity convertExpenseToInvoiceItem({ @required ExpenseEntity expense, - @required BuiltMap categoryMap, - @required CompanyEntity company, + @required BuildContext context, }) { + final state = StoreProvider.of(context).state; + final company = state.company; + final categoryMap = state.expenseCategoryState.map; + return InvoiceItemEntity().rebuild((b) => b ..typeId = InvoiceItemEntity.TYPE_EXPENSE ..expenseId = expense.id diff --git a/lib/redux/project/project_selectors.dart b/lib/redux/project/project_selectors.dart index ffabe2eda..482df380c 100644 --- a/lib/redux/project/project_selectors.dart +++ b/lib/redux/project/project_selectors.dart @@ -1,16 +1,20 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart'; import 'package:invoiceninja_flutter/redux/task/task_selectors.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -List convertProjectToInvoiceItem( - {BuildContext context, ProjectEntity project}) { +List convertProjectToInvoiceItem({ + BuildContext context, + ProjectEntity project, +}) { final List items = []; final state = StoreProvider.of(context).state; + final tasks = []; state.taskState.map.forEach((index, task) { if (task.isActive && @@ -21,12 +25,25 @@ List convertProjectToInvoiceItem( } }); + final expenses = []; + state.expenseState.map.forEach((index, expense) { + if (expense.isActive && + expense.projectId == project.id && + expense.isPending) { + expenses.add(expense); + } + }); + tasks.sort((taskA, taskB) { final taskADate = taskA.getTaskTimes().first.startDate; final taskBDate = taskB.getTaskTimes().first.startDate; return taskADate.compareTo(taskBDate); }); + expenses.sort((expenseA, expenseB) { + return expenseA.date.compareTo(expenseB.date); + }); + for (var i = 0; i < tasks.length; i++) { final task = tasks[i]; var item = convertTaskToInvoiceItem(task: task, context: context); @@ -39,6 +56,18 @@ List convertProjectToInvoiceItem( items.add(item); } + for (var i = 0; i < expenses.length; i++) { + final expense = expenses[i]; + var item = convertExpenseToInvoiceItem(expense: expense, context: context); + + if (i == 0) { + item = + item.rebuild((b) => b.notes = '## ${project.name}\n\n${item.notes}'); + } + + items.add(item); + } + return items; } diff --git a/lib/ui/invoice/edit/invoice_item_selector.dart b/lib/ui/invoice/edit/invoice_item_selector.dart index b3f8f45f0..2968f2fa5 100644 --- a/lib/ui/invoice/edit/invoice_item_selector.dart +++ b/lib/ui/invoice/edit/invoice_item_selector.dart @@ -83,9 +83,9 @@ class _InvoiceItemSelectorState extends State } else if (entity.entityType == EntityType.expense) { final expense = entity as ExpenseEntity; items.add(convertExpenseToInvoiceItem( - expense: expense, - categoryMap: state.expenseCategoryState.map, - company: company)); + expense: expense, + context: context, + )); } });