Invoice projects

This commit is contained in:
Hillel Coren 2021-10-03 19:57:38 +03:00
parent ccc6c5c59b
commit 26c0f10119
4 changed files with 42 additions and 10 deletions

View File

@ -245,7 +245,6 @@ void handleExpenseAction(
BuildContext context, List<BaseEntity> expenses, EntityAction action) { BuildContext context, List<BaseEntity> expenses, EntityAction action) {
final store = StoreProvider.of<AppState>(context); final store = StoreProvider.of<AppState>(context);
final state = store.state; final state = store.state;
final CompanyEntity company = state.company;
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final expense = expenses.first as ExpenseEntity; final expense = expenses.first as ExpenseEntity;
final expenseIds = expenses.map((expense) => expense.id).toList(); final expenseIds = expenses.map((expense) => expense.id).toList();
@ -277,8 +276,7 @@ void handleExpenseAction(
}) })
.map((expense) => convertExpenseToInvoiceItem( .map((expense) => convertExpenseToInvoiceItem(
expense: expense, expense: expense,
categoryMap: state.expenseCategoryState.map, context: context,
company: company,
)) ))
.toList(); .toList();
if (items.isNotEmpty) { if (items.isNotEmpty) {

View File

@ -1,4 +1,6 @@
import 'package:flutter/foundation.dart'; 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/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:invoiceninja_flutter/redux/static/static_state.dart';
import 'package:memoize/memoize.dart'; import 'package:memoize/memoize.dart';
@ -8,9 +10,12 @@ import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
InvoiceItemEntity convertExpenseToInvoiceItem({ InvoiceItemEntity convertExpenseToInvoiceItem({
@required ExpenseEntity expense, @required ExpenseEntity expense,
@required BuiltMap<String, ExpenseCategoryEntity> categoryMap, @required BuildContext context,
@required CompanyEntity company,
}) { }) {
final state = StoreProvider.of<AppState>(context).state;
final company = state.company;
final categoryMap = state.expenseCategoryState.map;
return InvoiceItemEntity().rebuild((b) => b return InvoiceItemEntity().rebuild((b) => b
..typeId = InvoiceItemEntity.TYPE_EXPENSE ..typeId = InvoiceItemEntity.TYPE_EXPENSE
..expenseId = expense.id ..expenseId = expense.id

View File

@ -1,16 +1,20 @@
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.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:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:memoize/memoize.dart'; import 'package:memoize/memoize.dart';
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
List<InvoiceItemEntity> convertProjectToInvoiceItem( List<InvoiceItemEntity> convertProjectToInvoiceItem({
{BuildContext context, ProjectEntity project}) { BuildContext context,
ProjectEntity project,
}) {
final List<InvoiceItemEntity> items = []; final List<InvoiceItemEntity> items = [];
final state = StoreProvider.of<AppState>(context).state; final state = StoreProvider.of<AppState>(context).state;
final tasks = <TaskEntity>[]; final tasks = <TaskEntity>[];
state.taskState.map.forEach((index, task) { state.taskState.map.forEach((index, task) {
if (task.isActive && if (task.isActive &&
@ -21,12 +25,25 @@ List<InvoiceItemEntity> convertProjectToInvoiceItem(
} }
}); });
final expenses = <ExpenseEntity>[];
state.expenseState.map.forEach((index, expense) {
if (expense.isActive &&
expense.projectId == project.id &&
expense.isPending) {
expenses.add(expense);
}
});
tasks.sort((taskA, taskB) { tasks.sort((taskA, taskB) {
final taskADate = taskA.getTaskTimes().first.startDate; final taskADate = taskA.getTaskTimes().first.startDate;
final taskBDate = taskB.getTaskTimes().first.startDate; final taskBDate = taskB.getTaskTimes().first.startDate;
return taskADate.compareTo(taskBDate); return taskADate.compareTo(taskBDate);
}); });
expenses.sort((expenseA, expenseB) {
return expenseA.date.compareTo(expenseB.date);
});
for (var i = 0; i < tasks.length; i++) { for (var i = 0; i < tasks.length; i++) {
final task = tasks[i]; final task = tasks[i];
var item = convertTaskToInvoiceItem(task: task, context: context); var item = convertTaskToInvoiceItem(task: task, context: context);
@ -39,6 +56,18 @@ List<InvoiceItemEntity> convertProjectToInvoiceItem(
items.add(item); 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; return items;
} }

View File

@ -83,9 +83,9 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector>
} else if (entity.entityType == EntityType.expense) { } else if (entity.entityType == EntityType.expense) {
final expense = entity as ExpenseEntity; final expense = entity as ExpenseEntity;
items.add(convertExpenseToInvoiceItem( items.add(convertExpenseToInvoiceItem(
expense: expense, expense: expense,
categoryMap: state.expenseCategoryState.map, context: context,
company: company)); ));
} }
}); });