Purchase orders

This commit is contained in:
Hillel Coren 2022-06-30 09:53:27 +03:00
parent a222e93d0d
commit 7312508913
10 changed files with 116 additions and 7 deletions

View File

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

View File

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

View File

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

View File

@ -405,7 +405,8 @@ class InvoiceEditDesktopState extends State<InvoiceEditDesktop>
),
DatePicker(
key: ValueKey('__terms_${client.id}__'),
labelText: entityType == EntityType.invoice
labelText: entityType == EntityType.invoice ||
entityType == EntityType.purchaseOrder
? localization.dueDate
: localization.validUntil,
selectedDate: invoice.dueDate,

View File

@ -284,7 +284,8 @@ class InvoiceEditDetailsState extends State<InvoiceEditDetails> {
},
),
DatePicker(
labelText: widget.entityType == EntityType.invoice
labelText: widget.entityType == EntityType.invoice ||
widget.entityType == EntityType.purchaseOrder
? localization.dueDate
: localization.validUntil,
selectedDate: invoice.dueDate,

View File

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

View File

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

View File

@ -96,7 +96,7 @@ class PurchaseOrderScreen extends StatelessWidget {
sortFields: [
PurchaseOrderFields.number,
PurchaseOrderFields.date,
PurchaseOrderFields.validUntil,
PurchaseOrderFields.dueDate,
EntityFields.updatedAt,
],
onSelectedState: (EntityState state, value) {

View File

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

View File

@ -16,6 +16,8 @@ mixin LocalizationsProvider on LocaleCodeAware {
static final Map<String, Map<String, String>> _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