Improve auto-taxes
This commit is contained in:
parent
7118838095
commit
473c8d8b95
|
|
@ -55,7 +55,7 @@ class AppDropdownButton<T> extends StatelessWidget {
|
||||||
if (labelText != null) {
|
if (labelText != null) {
|
||||||
dropDownButton = InputDecorator(
|
dropDownButton = InputDecorator(
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: labelText,
|
labelText: labelText.isEmpty ? null : '',
|
||||||
),
|
),
|
||||||
isEmpty: isEmpty && blankLabel == null,
|
isEmpty: isEmpty && blankLabel == null,
|
||||||
child: dropDownButton);
|
child: dropDownButton);
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ 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/ui/app/forms/app_dropdown_button.dart';
|
||||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
|
|
@ -56,6 +57,7 @@ class _InvoiceEditItemsDesktopState extends State<InvoiceEditItemsDesktop> {
|
||||||
static const COLUMN_TAX1 = 'tax1';
|
static const COLUMN_TAX1 = 'tax1';
|
||||||
static const COLUMN_TAX2 = 'tax2';
|
static const COLUMN_TAX2 = 'tax2';
|
||||||
static const COLUMN_TAX3 = 'tax3';
|
static const COLUMN_TAX3 = 'tax3';
|
||||||
|
static const COLUMN_TAX_CATEGORY = 'tax_category';
|
||||||
static const COLUMN_DISCOUNT = 'discount';
|
static const COLUMN_DISCOUNT = 'discount';
|
||||||
|
|
||||||
final _debouncer = Debouncer();
|
final _debouncer = Debouncer();
|
||||||
|
|
@ -77,6 +79,7 @@ class _InvoiceEditItemsDesktopState extends State<InvoiceEditItemsDesktop> {
|
||||||
final lineItems = viewModel.invoice.lineItems;
|
final lineItems = viewModel.invoice.lineItems;
|
||||||
final state = viewModel.state;
|
final state = viewModel.state;
|
||||||
final company = state.company;
|
final company = state.company;
|
||||||
|
final invoice = viewModel.invoice;
|
||||||
|
|
||||||
final includedLineItems = lineItems.where((lineItem) {
|
final includedLineItems = lineItems.where((lineItem) {
|
||||||
return (lineItem.typeId == InvoiceItemEntity.TYPE_TASK &&
|
return (lineItem.typeId == InvoiceItemEntity.TYPE_TASK &&
|
||||||
|
|
@ -212,14 +215,18 @@ class _InvoiceEditItemsDesktopState extends State<InvoiceEditItemsDesktop> {
|
||||||
company.hasCustomField(customField4)) {
|
company.hasCustomField(customField4)) {
|
||||||
_columns.add(COLUMN_CUSTOM4);
|
_columns.add(COLUMN_CUSTOM4);
|
||||||
} else if (ProductItemFields.tax == column) {
|
} else if (ProductItemFields.tax == column) {
|
||||||
if (hasTax1) {
|
if (company.calculateTaxes) {
|
||||||
_columns.add(COLUMN_TAX1);
|
_columns.add(COLUMN_TAX_CATEGORY);
|
||||||
}
|
} else {
|
||||||
if (hasTax2) {
|
if (hasTax1) {
|
||||||
_columns.add(COLUMN_TAX2);
|
_columns.add(COLUMN_TAX1);
|
||||||
}
|
}
|
||||||
if (hasTax3) {
|
if (hasTax2) {
|
||||||
_columns.add(COLUMN_TAX3);
|
_columns.add(COLUMN_TAX2);
|
||||||
|
}
|
||||||
|
if (hasTax3) {
|
||||||
|
_columns.add(COLUMN_TAX3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (ProductItemFields.discount == column &&
|
} else if (ProductItemFields.discount == column &&
|
||||||
company.enableProductDiscount) {
|
company.enableProductDiscount) {
|
||||||
|
|
@ -345,6 +352,8 @@ class _InvoiceEditItemsDesktopState extends State<InvoiceEditItemsDesktop> {
|
||||||
(company.settings.enableInclusiveTaxes
|
(company.settings.enableInclusiveTaxes
|
||||||
? ' - ${localization.inclusive}'
|
? ' - ${localization.inclusive}'
|
||||||
: '');
|
: '');
|
||||||
|
} else if (column == COLUMN_TAX_CATEGORY) {
|
||||||
|
label = localization.taxCategory;
|
||||||
} else if (column == COLUMN_QUANTITY) {
|
} else if (column == COLUMN_QUANTITY) {
|
||||||
if (widget.isTasks) {
|
if (widget.isTasks) {
|
||||||
label = (translations['hours'] ?? '').isNotEmpty
|
label = (translations['hours'] ?? '').isNotEmpty
|
||||||
|
|
@ -460,6 +469,8 @@ class _InvoiceEditItemsDesktopState extends State<InvoiceEditItemsDesktop> {
|
||||||
return Text(item.taxName2 ?? '');
|
return Text(item.taxName2 ?? '');
|
||||||
} else if (column == COLUMN_TAX3) {
|
} else if (column == COLUMN_TAX3) {
|
||||||
return Text(item.taxName3 ?? '');
|
return Text(item.taxName3 ?? '');
|
||||||
|
} else if (column == COLUMN_TAX_CATEGORY) {
|
||||||
|
return Text(kTaxCategories[item.taxCategoryId]);
|
||||||
} else if (column == COLUMN_UNIT_COST) {
|
} else if (column == COLUMN_UNIT_COST) {
|
||||||
return Text(
|
return Text(
|
||||||
formatNumber(
|
formatNumber(
|
||||||
|
|
@ -984,6 +995,30 @@ class _InvoiceEditItemsDesktopState extends State<InvoiceEditItemsDesktop> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
} else if (column == COLUMN_TAX_CATEGORY) {
|
||||||
|
return Focus(
|
||||||
|
onFocusChange: (hasFocus) => _onFocusChange(),
|
||||||
|
skipTraversal: true,
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.only(right: kTableColumnGap),
|
||||||
|
child: AppDropdownButton<String>(
|
||||||
|
labelText: '',
|
||||||
|
value: lineItems[index].taxCategoryId,
|
||||||
|
onChanged: (dynamic value) => _onChanged(
|
||||||
|
lineItems[index].rebuild(
|
||||||
|
(b) => b..taxCategoryId = value),
|
||||||
|
index),
|
||||||
|
items: kTaxCategories.keys
|
||||||
|
.map((key) => DropdownMenuItem<String>(
|
||||||
|
child: Text(localization.lookup(
|
||||||
|
kTaxCategories[key],
|
||||||
|
)),
|
||||||
|
value: key,
|
||||||
|
))
|
||||||
|
.toList()),
|
||||||
|
),
|
||||||
|
);
|
||||||
} else if (column == COLUMN_TAX3) {
|
} else if (column == COLUMN_TAX3) {
|
||||||
return Focus(
|
return Focus(
|
||||||
onFocusChange: (hasFocus) => _onFocusChange(),
|
onFocusChange: (hasFocus) => _onFocusChange(),
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,10 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
'routing_id': 'Routing ID',
|
'routing_id': 'Routing ID',
|
||||||
'enable_e_invoice': 'Enable E-Invoice',
|
'enable_e_invoice': 'Enable E-Invoice',
|
||||||
'e_invoice_type': 'E-Invoice Type',
|
'e_invoice_type': 'E-Invoice Type',
|
||||||
'reduced_tax': 'Reduced Tax',
|
'reduced_tax': 'Reduced',
|
||||||
'override_tax': 'Override Tax',
|
'override_tax': 'Override',
|
||||||
'zero_rated': 'Zero Rated',
|
'zero_rated': 'Zero Rated',
|
||||||
'reverse_tax': 'Reverse Tax',
|
'reverse_tax': 'Reverse',
|
||||||
'updated_tax_category': 'Successfully updated the tax category',
|
'updated_tax_category': 'Successfully updated the tax category',
|
||||||
'updated_tax_categories': 'Successfully updated the tax categories',
|
'updated_tax_categories': 'Successfully updated the tax categories',
|
||||||
'set_tax_category': 'Set Tax Category',
|
'set_tax_category': 'Set Tax Category',
|
||||||
|
|
@ -69,7 +69,7 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
'digital_products': 'Digital Products',
|
'digital_products': 'Digital Products',
|
||||||
'services': 'Services',
|
'services': 'Services',
|
||||||
'shipping': 'Shipping',
|
'shipping': 'Shipping',
|
||||||
'tax_exempt': 'Tax Exempt',
|
'tax_exempt': 'Exempt',
|
||||||
'reduced_rate': 'Reduced Rate',
|
'reduced_rate': 'Reduced Rate',
|
||||||
'tax_all': 'Tax All',
|
'tax_all': 'Tax All',
|
||||||
'tax_selected': 'Tax Selected',
|
'tax_selected': 'Tax Selected',
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue