Add QR IBAN

This commit is contained in:
Hillel Coren 2022-06-30 09:32:28 +03:00
parent 3cf9cbdfac
commit a222e93d0d
7 changed files with 277 additions and 162 deletions

View File

@ -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';

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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(

View File

@ -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) {