Add QR IBAN
This commit is contained in:
parent
3cf9cbdfac
commit
a222e93d0d
|
|
@ -171,6 +171,7 @@ const String kCurrencyEuro = '3';
|
||||||
|
|
||||||
const String kCountryUnitedStates = '840';
|
const String kCountryUnitedStates = '840';
|
||||||
const String kCountryCanada = '124';
|
const String kCountryCanada = '124';
|
||||||
|
const String kCountrySwitzerland = '756';
|
||||||
|
|
||||||
const String kInvoiceStatusViewed = '-3';
|
const String kInvoiceStatusViewed = '-3';
|
||||||
const String kInvoiceStatusUnpaid = '-2';
|
const String kInvoiceStatusUnpaid = '-2';
|
||||||
|
|
|
||||||
|
|
@ -619,6 +619,8 @@ abstract class CompanyEntity extends Object
|
||||||
|
|
||||||
String get currencyId => settings.currencyId ?? kDefaultCurrencyId;
|
String get currencyId => settings.currencyId ?? kDefaultCurrencyId;
|
||||||
|
|
||||||
|
bool get supportsQrIban => settings.countryId == kCountrySwitzerland;
|
||||||
|
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
static void _initializeBuilder(CompanyEntityBuilder builder) => builder
|
static void _initializeBuilder(CompanyEntityBuilder builder) => builder
|
||||||
..calculateExpenseTaxByAmount = false
|
..calculateExpenseTaxByAmount = false
|
||||||
|
|
|
||||||
|
|
@ -885,6 +885,14 @@ abstract class SettingsEntity
|
||||||
@BuiltValueField(wireName: 'purchase_order_number_counter')
|
@BuiltValueField(wireName: 'purchase_order_number_counter')
|
||||||
int get purchaseOrderNumberCounter;
|
int get purchaseOrderNumberCounter;
|
||||||
|
|
||||||
|
@nullable
|
||||||
|
@BuiltValueField(wireName: 'qr_iban')
|
||||||
|
String get qrIban;
|
||||||
|
|
||||||
|
@nullable
|
||||||
|
@BuiltValueField(wireName: 'besr_id')
|
||||||
|
String get besrId;
|
||||||
|
|
||||||
bool get hasAddress => address1 != null && address1.isNotEmpty;
|
bool get hasAddress => address1 != null && address1.isNotEmpty;
|
||||||
|
|
||||||
bool get hasLogo => companyLogo != null && companyLogo.isNotEmpty;
|
bool get hasLogo => companyLogo != null && companyLogo.isNotEmpty;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -78,6 +78,8 @@ class _CompanyDetailsState extends State<CompanyDetails>
|
||||||
final _creditFooterController = TextEditingController();
|
final _creditFooterController = TextEditingController();
|
||||||
final _purchaseOrderTermsController = TextEditingController();
|
final _purchaseOrderTermsController = TextEditingController();
|
||||||
final _purchaseOrderFooterController = TextEditingController();
|
final _purchaseOrderFooterController = TextEditingController();
|
||||||
|
final _qrIbanController = TextEditingController();
|
||||||
|
final _besrIdController = TextEditingController();
|
||||||
|
|
||||||
List<TextEditingController> _controllers = [];
|
List<TextEditingController> _controllers = [];
|
||||||
|
|
||||||
|
|
@ -126,6 +128,8 @@ class _CompanyDetailsState extends State<CompanyDetails>
|
||||||
_creditTermsController,
|
_creditTermsController,
|
||||||
_purchaseOrderFooterController,
|
_purchaseOrderFooterController,
|
||||||
_purchaseOrderTermsController,
|
_purchaseOrderTermsController,
|
||||||
|
_qrIbanController,
|
||||||
|
_besrIdController,
|
||||||
];
|
];
|
||||||
|
|
||||||
_controllers.forEach(
|
_controllers.forEach(
|
||||||
|
|
@ -157,6 +161,8 @@ class _CompanyDetailsState extends State<CompanyDetails>
|
||||||
_creditTermsController.text = settings.defaultCreditTerms;
|
_creditTermsController.text = settings.defaultCreditTerms;
|
||||||
_purchaseOrderFooterController.text = settings.defaultPurchaseOrderFooter;
|
_purchaseOrderFooterController.text = settings.defaultPurchaseOrderFooter;
|
||||||
_purchaseOrderTermsController.text = settings.defaultPurchaseOrderTerms;
|
_purchaseOrderTermsController.text = settings.defaultPurchaseOrderTerms;
|
||||||
|
_qrIbanController.text = settings.qrIban;
|
||||||
|
_besrIdController.text = settings.besrId;
|
||||||
|
|
||||||
_controllers.forEach(
|
_controllers.forEach(
|
||||||
(dynamic controller) => controller.addListener(_onSettingsChanged));
|
(dynamic controller) => controller.addListener(_onSettingsChanged));
|
||||||
|
|
@ -200,7 +206,9 @@ class _CompanyDetailsState extends State<CompanyDetails>
|
||||||
..defaultCreditFooter = _creditFooterController.text.trim()
|
..defaultCreditFooter = _creditFooterController.text.trim()
|
||||||
..defaultCreditTerms = _creditTermsController.text.trim()
|
..defaultCreditTerms = _creditTermsController.text.trim()
|
||||||
..defaultPurchaseOrderFooter = _purchaseOrderFooterController.text.trim()
|
..defaultPurchaseOrderFooter = _purchaseOrderFooterController.text.trim()
|
||||||
..defaultPurchaseOrderTerms = _purchaseOrderTermsController.text.trim());
|
..defaultPurchaseOrderTerms = _purchaseOrderTermsController.text.trim()
|
||||||
|
..qrIban = _qrIbanController.text.trim()
|
||||||
|
..besrId = _besrIdController.text.trim());
|
||||||
if (settings != widget.viewModel.settings) {
|
if (settings != widget.viewModel.settings) {
|
||||||
_debouncer.run(() {
|
_debouncer.run(() {
|
||||||
widget.viewModel.onSettingsChanged(settings);
|
widget.viewModel.onSettingsChanged(settings);
|
||||||
|
|
@ -323,6 +331,23 @@ class _CompanyDetailsState extends State<CompanyDetails>
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
if (company.supportsQrIban)
|
||||||
|
FormCard(
|
||||||
|
children: [
|
||||||
|
DecoratedFormField(
|
||||||
|
label: localization.qrIban,
|
||||||
|
controller: _qrIbanController,
|
||||||
|
onSavePressed: viewModel.onSavePressed,
|
||||||
|
keyboardType: TextInputType.text,
|
||||||
|
),
|
||||||
|
DecoratedFormField(
|
||||||
|
label: localization.besrId,
|
||||||
|
controller: _besrIdController,
|
||||||
|
onSavePressed: viewModel.onSavePressed,
|
||||||
|
keyboardType: TextInputType.text,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
if (!state.settingsUIState.isFiltered)
|
if (!state.settingsUIState.isFiltered)
|
||||||
FormCard(
|
FormCard(
|
||||||
isLast: true,
|
isLast: true,
|
||||||
|
|
|
||||||
|
|
@ -62,10 +62,25 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
final settingsUIState = widget.viewModel.state.settingsUIState;
|
final state = widget.viewModel.state;
|
||||||
|
final settingsUIState = state.settingsUIState;
|
||||||
_focusNode = FocusScopeNode();
|
_focusNode = FocusScopeNode();
|
||||||
|
|
||||||
|
int tabs = 6;
|
||||||
|
|
||||||
|
[
|
||||||
|
EntityType.invoice,
|
||||||
|
EntityType.quote,
|
||||||
|
EntityType.credit,
|
||||||
|
EntityType.task,
|
||||||
|
].forEach((entityType) {
|
||||||
|
if (state.company.isModuleEnabled(entityType)) {
|
||||||
|
tabs++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
_controller = TabController(
|
_controller = TabController(
|
||||||
vsync: this, length: 10, initialIndex: settingsUIState.tabIndex);
|
vsync: this, length: tabs, initialIndex: settingsUIState.tabIndex);
|
||||||
_controller.addListener(_onTabChanged);
|
_controller.addListener(_onTabChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -110,10 +125,14 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
Tab(text: localization.clientDetails),
|
Tab(text: localization.clientDetails),
|
||||||
Tab(text: localization.companyDetails),
|
Tab(text: localization.companyDetails),
|
||||||
Tab(text: localization.companyAddress),
|
Tab(text: localization.companyAddress),
|
||||||
|
if (company.isModuleEnabled(EntityType.invoice))
|
||||||
Tab(text: localization.invoiceDetails),
|
Tab(text: localization.invoiceDetails),
|
||||||
|
if (company.isModuleEnabled(EntityType.quote))
|
||||||
Tab(text: localization.quoteDetails),
|
Tab(text: localization.quoteDetails),
|
||||||
|
if (company.isModuleEnabled(EntityType.credit))
|
||||||
Tab(text: localization.creditDetails),
|
Tab(text: localization.creditDetails),
|
||||||
Tab(text: localization.productColumns),
|
Tab(text: localization.productColumns),
|
||||||
|
if (company.isModuleEnabled(EntityType.task))
|
||||||
Tab(text: localization.taskColumns),
|
Tab(text: localization.taskColumns),
|
||||||
Tab(text: localization.totalFields),
|
Tab(text: localization.totalFields),
|
||||||
],
|
],
|
||||||
|
|
@ -579,6 +598,7 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
prefix: 'company',
|
prefix: 'company',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (company.isModuleEnabled(EntityType.invoice))
|
||||||
FormCard(
|
FormCard(
|
||||||
isLast: true,
|
isLast: true,
|
||||||
child: MultiSelectList(
|
child: MultiSelectList(
|
||||||
|
|
@ -610,7 +630,8 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
InvoiceFields.total,
|
InvoiceFields.total,
|
||||||
InvoiceFields.balanceDue,
|
InvoiceFields.balanceDue,
|
||||||
].map((field) => '\$invoice.$field').toList(),
|
].map((field) => '\$invoice.$field').toList(),
|
||||||
selected: settings.getFieldsForSection(kPdfFieldsInvoiceDetails),
|
selected:
|
||||||
|
settings.getFieldsForSection(kPdfFieldsInvoiceDetails),
|
||||||
onSelected: (values) {
|
onSelected: (values) {
|
||||||
viewModel.onSettingsChanged(settings.setFieldsForSection(
|
viewModel.onSettingsChanged(settings.setFieldsForSection(
|
||||||
kPdfFieldsInvoiceDetails, values));
|
kPdfFieldsInvoiceDetails, values));
|
||||||
|
|
@ -620,6 +641,7 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
prefix: 'invoice',
|
prefix: 'invoice',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (company.isModuleEnabled(EntityType.quote))
|
||||||
FormCard(
|
FormCard(
|
||||||
isLast: true,
|
isLast: true,
|
||||||
child: MultiSelectList(
|
child: MultiSelectList(
|
||||||
|
|
@ -656,6 +678,7 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
prefix: 'quote',
|
prefix: 'quote',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (company.isModuleEnabled(EntityType.credit))
|
||||||
FormCard(
|
FormCard(
|
||||||
isLast: true,
|
isLast: true,
|
||||||
child: MultiSelectList(
|
child: MultiSelectList(
|
||||||
|
|
@ -728,6 +751,7 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
prefix: 'product',
|
prefix: 'product',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (company.isModuleEnabled(EntityType.task))
|
||||||
FormCard(
|
FormCard(
|
||||||
isLast: true,
|
isLast: true,
|
||||||
child: MultiSelectList(
|
child: MultiSelectList(
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
static final Map<String, Map<String, String>> _localizedValues = {
|
static final Map<String, Map<String, String>> _localizedValues = {
|
||||||
'en': {
|
'en': {
|
||||||
// STARTER: lang key - do not remove comment
|
// STARTER: lang key - do not remove comment
|
||||||
|
'qr_iban': 'QR IBAN',
|
||||||
|
'besr_id': 'BESR ID',
|
||||||
'accept': 'Accept',
|
'accept': 'Accept',
|
||||||
'clone_to_purchase_order': 'Clone to PO',
|
'clone_to_purchase_order': 'Clone to PO',
|
||||||
'vendor_email_not_set': 'Vendor does not have an email address set',
|
'vendor_email_not_set': 'Vendor does not have an email address set',
|
||||||
|
|
@ -70820,6 +70822,15 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
_localizedValues[localeCode]['accept'] ??
|
_localizedValues[localeCode]['accept'] ??
|
||||||
_localizedValues['en']['accept'];
|
_localizedValues['en']['accept'];
|
||||||
|
|
||||||
|
String get qrIban =>
|
||||||
|
_localizedValues[localeCode]['qr_iban'] ??
|
||||||
|
_localizedValues['en']['qr_iban'];
|
||||||
|
|
||||||
|
String get besrId =>
|
||||||
|
_localizedValues[localeCode]['besr_id'] ??
|
||||||
|
_localizedValues['en']['besr_id'];
|
||||||
|
|
||||||
|
|
||||||
// STARTER: lang field - do not remove comment
|
// STARTER: lang field - do not remove comment
|
||||||
|
|
||||||
String lookup(String key) {
|
String lookup(String key) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue