Invoice projects
This commit is contained in:
parent
ccc6c5c59b
commit
26c0f10119
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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));
|
));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue