From 7312508913806f62b6b4c56e295d042bc6ae6cb0 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 30 Jun 2022 09:53:27 +0300 Subject: [PATCH] Purchase orders --- lib/constants.dart | 2 + lib/data/models/purchase_order_model.dart | 2 +- lib/data/models/vendor_model.dart | 3 + lib/ui/invoice/edit/invoice_edit_desktop.dart | 3 +- lib/ui/invoice/edit/invoice_edit_details.dart | 3 +- .../invoice/view/invoice_view_overview.dart | 2 +- .../purchase_order_presenter.dart | 4 +- .../purchase_order/purchase_order_screen.dart | 2 +- lib/ui/settings/invoice_design.dart | 93 +++++++++++++++++++ lib/utils/i18n.dart | 9 ++ 10 files changed, 116 insertions(+), 7 deletions(-) diff --git a/lib/constants.dart b/lib/constants.dart index 0d0e39273..9b829aeb5 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -518,6 +518,8 @@ const String kPdfFieldsInvoiceDetails = 'invoice_details'; const String kPdfFieldsQuoteDetails = 'quote_details'; const String kPdfFieldsCreditDetails = 'credit_details'; const String kPdfFieldsProductColumns = 'product_columns'; +const String kPdfFieldsVendorDetails = 'vendor_details'; +const String kPdfFieldsPurchaseOrderDetails = 'purchase_order_details'; const String kPdfFieldsTaskColumns = 'task_columns'; const String kPdfFieldsTotalFields = 'total_columns'; diff --git a/lib/data/models/purchase_order_model.dart b/lib/data/models/purchase_order_model.dart index 8861f57ee..010a9383e 100644 --- a/lib/data/models/purchase_order_model.dart +++ b/lib/data/models/purchase_order_model.dart @@ -13,7 +13,7 @@ class PurchaseOrderFields { static const String discount = 'discount'; static const String poNumber = 'po_number'; static const String date = 'date'; - static const String validUntil = 'valid_until'; + static const String dueDate = 'due_date'; static const String nextSendDate = 'next_send_date'; static const String lastSentDate = 'last_sent_date'; static const String terms = 'terms'; diff --git a/lib/data/models/vendor_model.dart b/lib/data/models/vendor_model.dart index ba89aa10d..09e6448dd 100644 --- a/lib/data/models/vendor_model.dart +++ b/lib/data/models/vendor_model.dart @@ -58,6 +58,7 @@ class VendorFields { static const String state = 'state'; static const String postalCode = 'postal_code'; static const String countryId = 'country_id'; + static const String country = 'country'; static const String phone = 'phone'; static const String privateNotes = 'private_notes'; static const String publicNotes = 'public_notes'; @@ -74,6 +75,8 @@ class VendorFields { static const String isDeleted = 'is_deleted'; static const String documents = 'documents'; static const String contacts = 'contacts'; + static const String cityStatePostal = 'city_state_postal'; + static const String postalCityState = 'postal_city_state'; } abstract class VendorEntity extends Object diff --git a/lib/ui/invoice/edit/invoice_edit_desktop.dart b/lib/ui/invoice/edit/invoice_edit_desktop.dart index 3e15c2e72..1c207efb2 100644 --- a/lib/ui/invoice/edit/invoice_edit_desktop.dart +++ b/lib/ui/invoice/edit/invoice_edit_desktop.dart @@ -405,7 +405,8 @@ class InvoiceEditDesktopState extends State ), DatePicker( key: ValueKey('__terms_${client.id}__'), - labelText: entityType == EntityType.invoice + labelText: entityType == EntityType.invoice || + entityType == EntityType.purchaseOrder ? localization.dueDate : localization.validUntil, selectedDate: invoice.dueDate, diff --git a/lib/ui/invoice/edit/invoice_edit_details.dart b/lib/ui/invoice/edit/invoice_edit_details.dart index 97ffb1ffb..92bd9f2f8 100644 --- a/lib/ui/invoice/edit/invoice_edit_details.dart +++ b/lib/ui/invoice/edit/invoice_edit_details.dart @@ -284,7 +284,8 @@ class InvoiceEditDetailsState extends State { }, ), DatePicker( - labelText: widget.entityType == EntityType.invoice + labelText: widget.entityType == EntityType.invoice || + widget.entityType == EntityType.purchaseOrder ? localization.dueDate : localization.validUntil, selectedDate: invoice.dueDate, diff --git a/lib/ui/invoice/view/invoice_view_overview.dart b/lib/ui/invoice/view/invoice_view_overview.dart index 1118859d9..0e01efb91 100644 --- a/lib/ui/invoice/view/invoice_view_overview.dart +++ b/lib/ui/invoice/view/invoice_view_overview.dart @@ -144,7 +144,7 @@ class InvoiceOverview extends StatelessWidget { } String dueDateField = InvoiceFields.dueDate; - if (invoice.isQuote || invoice.isPurchaseOrder) { + if (invoice.isQuote || invoice.isCredit) { dueDateField = QuoteFields.validUntil; } diff --git a/lib/ui/purchase_order/purchase_order_presenter.dart b/lib/ui/purchase_order/purchase_order_presenter.dart index 0e4e6dae3..7a2112edd 100644 --- a/lib/ui/purchase_order/purchase_order_presenter.dart +++ b/lib/ui/purchase_order/purchase_order_presenter.dart @@ -25,7 +25,7 @@ class PurchaseOrderPresenter extends EntityPresenter { PurchaseOrderFields.vendor, PurchaseOrderFields.amount, PurchaseOrderFields.date, - PurchaseOrderFields.validUntil, + PurchaseOrderFields.dueDate, ]; } @@ -86,7 +86,7 @@ class PurchaseOrderPresenter extends EntityPresenter { child: Text(formatNumber(purchaseOrder.amount, context, clientId: purchaseOrder.clientId)), ); - case PurchaseOrderFields.validUntil: + case PurchaseOrderFields.dueDate: return Text(formatDate(purchaseOrder.dueDate, context)); case PurchaseOrderFields.customValue1: return Text(presentCustomField(context, purchaseOrder.customValue1)); diff --git a/lib/ui/purchase_order/purchase_order_screen.dart b/lib/ui/purchase_order/purchase_order_screen.dart index 1750ef8dc..079ac324b 100644 --- a/lib/ui/purchase_order/purchase_order_screen.dart +++ b/lib/ui/purchase_order/purchase_order_screen.dart @@ -96,7 +96,7 @@ class PurchaseOrderScreen extends StatelessWidget { sortFields: [ PurchaseOrderFields.number, PurchaseOrderFields.date, - PurchaseOrderFields.validUntil, + PurchaseOrderFields.dueDate, EntityFields.updatedAt, ], onSelectedState: (EntityState state, value) { diff --git a/lib/ui/settings/invoice_design.dart b/lib/ui/settings/invoice_design.dart index edadd7874..78a43b223 100644 --- a/lib/ui/settings/invoice_design.dart +++ b/lib/ui/settings/invoice_design.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/data/models/purchase_order_model.dart'; import 'package:invoiceninja_flutter/data/models/quote_model.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; @@ -73,6 +74,8 @@ class _InvoiceDesignState extends State EntityType.quote, EntityType.credit, EntityType.task, + EntityType.vendor, + EntityType.purchaseOrder, ].forEach((entityType) { if (state.company.isModuleEnabled(entityType)) { tabs++; @@ -131,6 +134,10 @@ class _InvoiceDesignState extends State Tab(text: localization.quoteDetails), if (company.isModuleEnabled(EntityType.credit)) Tab(text: localization.creditDetails), + if (company.isModuleEnabled(EntityType.vendor)) + Tab(text: localization.vendorDetails), + if (company.isModuleEnabled(EntityType.purchaseOrder)) + Tab(text: localization.purchaseOrderDetails), Tab(text: localization.productColumns), if (company.isModuleEnabled(EntityType.task)) Tab(text: localization.taskColumns), @@ -715,6 +722,92 @@ class _InvoiceDesignState extends State prefix: 'credit', ), ), + if (company.isModuleEnabled(EntityType.vendor)) + FormCard( + isLast: true, + child: MultiSelectList( + options: [ + ...[ + VendorFields.name, + VendorFields.number, + VendorFields.vatNumber, + VendorFields.address1, + VendorFields.address2, + VendorFields.cityStatePostal, + //VendorFields.postalCityState, + VendorFields.country, + VendorFields.customValue1, + VendorFields.customValue2, + VendorFields.customValue3, + VendorFields.customValue4, + ].map((field) => '\$vendor.$field'), + ...[ + ContactFields.email, + ].map((field) => '\$contact.$field'), + ], + defaultSelected: [ + ...[ + VendorFields.name, + VendorFields.number, + VendorFields.vatNumber, + VendorFields.address1, + VendorFields.address2, + VendorFields.cityStatePostal, + ].map((field) => '\$vendor.$field'), + ...[ + ContactFields.email, + ].map((field) => '\$contact.$field'), + ], + selected: settings.getFieldsForSection(kPdfFieldsVendorDetails), + onSelected: (values) { + viewModel.onSettingsChanged(settings.setFieldsForSection( + kPdfFieldsVendorDetails, values)); + }, + addTitle: localization.addField, + liveChanges: true, + prefix: 'vendor', + ), + ), + if (company.isModuleEnabled(EntityType.purchaseOrder)) + FormCard( + isLast: true, + child: MultiSelectList( + options: [ + ...[ + PurchaseOrderFields.number, + PurchaseOrderFields.date, + PurchaseOrderFields.dueDate, + PurchaseOrderFields.total, + PurchaseOrderFields.balanceDue, + //PurchaseOrderFields.customValue1, + //PurchaseOrderFields.customValue2, + //PurchaseOrderFields.customValue3, + //PurchaseOrderFields.customValue4, + ].map((field) => '\$credit.$field'), + /* + ...[ + ClientFields.balance, + ].map((field) => '\$client.$field') + */ + ], + defaultSelected: [ + PurchaseOrderFields.number, + PurchaseOrderFields.date, + PurchaseOrderFields.dueDate, + PurchaseOrderFields.total, + PurchaseOrderFields.balanceDue, + ].map((field) => '\$purchase_order.$field').toList(), + selected: settings + .getFieldsForSection(kPdfFieldsPurchaseOrderDetails), + onSelected: (values) { + viewModel.onSettingsChanged(settings.setFieldsForSection( + kPdfFieldsPurchaseOrderDetails, values)); + }, + addTitle: localization.addField, + liveChanges: true, + prefix: 'purchase_order', + ), + ), FormCard( isLast: true, child: MultiSelectList( diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index ae24baa4f..4674c937b 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -16,6 +16,8 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'vendor_details': 'Vendor Details', + 'purchase_order_details': 'Purchase Order Details', 'qr_iban': 'QR IBAN', 'besr_id': 'BESR ID', 'accept': 'Accept', @@ -70830,6 +70832,13 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]['besr_id'] ?? _localizedValues['en']['besr_id']; + String get vendorDetails => + _localizedValues[localeCode]['vendor_details'] ?? + _localizedValues['en']['vendor_details']; + + String get purchaseOrderDetails => + _localizedValues[localeCode]['purchase_order_details'] ?? + _localizedValues['en']['purchase_order_details']; // STARTER: lang field - do not remove comment