From 46f433b41c79e48536ba9db4d9337656abe0d1b7 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 20 Jun 2022 18:22:22 +0300 Subject: [PATCH] Purchase orders --- lib/data/models/client_model.dart | 29 ++-- lib/data/models/client_model.g.dart | 153 +++++++++--------- lib/data/models/entities.dart | 6 +- lib/data/models/invoice_model.dart | 16 +- lib/data/models/serializers.g.dart | 19 +-- lib/redux/client/client_actions.dart | 8 +- lib/redux/client/client_reducer.dart | 14 +- lib/redux/client/client_state.dart | 4 +- lib/redux/client/client_state.g.dart | 15 +- lib/redux/credit/credit_actions.dart | 2 +- lib/redux/credit/credit_reducer.dart | 2 +- lib/redux/credit/credit_selectors.dart | 3 +- lib/redux/invoice/invoice_actions.dart | 2 +- lib/redux/invoice/invoice_reducer.dart | 2 +- lib/redux/invoice/invoice_selectors.dart | 2 +- .../purchase_order_actions.dart | 2 +- lib/redux/quote/quote_actions.dart | 2 +- lib/redux/quote/quote_reducer.dart | 2 +- lib/redux/quote/quote_selectors.dart | 3 +- .../recurring_invoice_actions.dart | 2 +- .../recurring_invoice_reducer.dart | 2 +- lib/redux/vendor/vendor_reducer.dart | 2 +- lib/ui/client/edit/client_edit_contacts.dart | 10 +- .../client/edit/client_edit_contacts_vm.dart | 6 +- .../invoice/edit/invoice_edit_contacts.dart | 18 +-- .../edit/invoice_edit_contacts_vm.dart | 37 ++++- .../invoice/view/invoice_view_contacts.dart | 2 +- 27 files changed, 210 insertions(+), 155 deletions(-) diff --git a/lib/data/models/client_model.dart b/lib/data/models/client_model.dart index 9fcdf8fe0..040fcd1a2 100644 --- a/lib/data/models/client_model.dart +++ b/lib/data/models/client_model.dart @@ -149,8 +149,10 @@ abstract class ClientEntity extends Object customValue2: '', customValue3: '', customValue4: '', - contacts: BuiltList( - [ContactEntity().rebuild((b) => b..isPrimary = true)], + contacts: BuiltList( + [ + ClientContactEntity().rebuild((b) => b..isPrimary = true) + ], ), activities: BuiltList(), ledger: BuiltList(), @@ -295,7 +297,7 @@ abstract class ClientEntity extends Object @BuiltValueField(wireName: 'custom_value4') String get customValue4; - BuiltList get contacts; + BuiltList get contacts; BuiltList get activities; @@ -356,11 +358,11 @@ abstract class ClientEntity extends Object return template; } - ContactEntity get primaryContact => + ClientContactEntity get primaryContact => contacts.firstWhere((contact) => contact.isPrimary, - orElse: () => ContactEntity()); + orElse: () => ClientContactEntity()); - List get emailContacts { + List get emailContacts { final list = contacts.where((contact) => contact.sendEmail).toList(); return list.isEmpty ? [primaryContact] : list; } @@ -740,7 +742,7 @@ abstract class ClientEntity extends Object String get languageId => settings.languageId; - ContactEntity getContact(String contactId) => contacts + ClientContactEntity getContact(String contactId) => contacts .firstWhere((contact) => contact.id == contactId, orElse: () => null); bool get hasNameSet { @@ -781,11 +783,11 @@ class ContactFields { static const String custom4 = 'custom4'; } -abstract class ContactEntity extends Object +abstract class ClientContactEntity extends Object with BaseEntity, SelectableEntity - implements Built { - factory ContactEntity() { - return _$ContactEntity._( + implements Built { + factory ClientContactEntity() { + return _$ClientContactEntity._( id: BaseEntity.nextId, isChanged: false, firstName: '', @@ -811,7 +813,7 @@ abstract class ContactEntity extends Object ); } - ContactEntity._(); + ClientContactEntity._(); @override @memoized @@ -938,5 +940,6 @@ abstract class ContactEntity extends Object @override FormatNumberType get listDisplayAmountType => FormatNumberType.money; - static Serializer get serializer => _$contactEntitySerializer; + static Serializer get serializer => + _$clientContactEntitySerializer; } diff --git a/lib/data/models/client_model.g.dart b/lib/data/models/client_model.g.dart index 7a821b21a..57597421f 100644 --- a/lib/data/models/client_model.g.dart +++ b/lib/data/models/client_model.g.dart @@ -12,8 +12,8 @@ Serializer _$clientItemResponseSerializer = new _$ClientItemResponseSerializer(); Serializer _$clientEntitySerializer = new _$ClientEntitySerializer(); -Serializer _$contactEntitySerializer = - new _$ContactEntitySerializer(); +Serializer _$clientContactEntitySerializer = + new _$ClientContactEntitySerializer(); class _$ClientListResponseSerializer implements StructuredSerializer { @@ -214,8 +214,8 @@ class _$ClientEntitySerializer implements StructuredSerializer { specifiedType: const FullType(String)), 'contacts', serializers.serialize(object.contacts, - specifiedType: - const FullType(BuiltList, const [const FullType(ContactEntity)])), + specifiedType: const FullType( + BuiltList, const [const FullType(ClientContactEntity)])), 'activities', serializers.serialize(object.activities, specifiedType: const FullType( @@ -440,7 +440,7 @@ class _$ClientEntitySerializer implements StructuredSerializer { case 'contacts': result.contacts.replace(serializers.deserialize(value, specifiedType: const FullType( - BuiltList, const [const FullType(ContactEntity)])) + BuiltList, const [const FullType(ClientContactEntity)])) as BuiltList); break; case 'activities': @@ -512,14 +512,19 @@ class _$ClientEntitySerializer implements StructuredSerializer { } } -class _$ContactEntitySerializer implements StructuredSerializer { +class _$ClientContactEntitySerializer + implements StructuredSerializer { @override - final Iterable types = const [ContactEntity, _$ContactEntity]; + final Iterable types = const [ + ClientContactEntity, + _$ClientContactEntity + ]; @override - final String wireName = 'ContactEntity'; + final String wireName = 'ClientContactEntity'; @override - Iterable serialize(Serializers serializers, ContactEntity object, + Iterable serialize( + Serializers serializers, ClientContactEntity object, {FullType specifiedType = FullType.unspecified}) { final result = [ 'first_name', @@ -608,10 +613,10 @@ class _$ContactEntitySerializer implements StructuredSerializer { } @override - ContactEntity deserialize( + ClientContactEntity deserialize( Serializers serializers, Iterable serialized, {FullType specifiedType = FullType.unspecified}) { - final result = new ContactEntityBuilder(); + final result = new ClientContactEntityBuilder(); final iterator = serialized.iterator; while (iterator.moveNext()) { @@ -971,7 +976,7 @@ class _$ClientEntity extends ClientEntity { @override final String customValue4; @override - final BuiltList contacts; + final BuiltList contacts; @override final BuiltList activities; @override @@ -1438,10 +1443,10 @@ class ClientEntityBuilder String get customValue4 => _$this._customValue4; set customValue4(String customValue4) => _$this._customValue4 = customValue4; - ListBuilder _contacts; - ListBuilder get contacts => - _$this._contacts ??= new ListBuilder(); - set contacts(ListBuilder contacts) => + ListBuilder _contacts; + ListBuilder get contacts => + _$this._contacts ??= new ListBuilder(); + set contacts(ListBuilder contacts) => _$this._contacts = contacts; ListBuilder _activities; @@ -1672,7 +1677,7 @@ class ClientEntityBuilder } } -class _$ContactEntity extends ContactEntity { +class _$ClientContactEntity extends ClientContactEntity { @override final String firstName; @override @@ -1718,10 +1723,11 @@ class _$ContactEntity extends ContactEntity { @override final String id; - factory _$ContactEntity([void Function(ContactEntityBuilder) updates]) => - (new ContactEntityBuilder()..update(updates)).build(); + factory _$ClientContactEntity( + [void Function(ClientContactEntityBuilder) updates]) => + (new ClientContactEntityBuilder()..update(updates)).build(); - _$ContactEntity._( + _$ClientContactEntity._( {this.firstName, this.lastName, this.email, @@ -1746,50 +1752,54 @@ class _$ContactEntity extends ContactEntity { this.id}) : super._() { BuiltValueNullFieldError.checkNotNull( - firstName, 'ContactEntity', 'firstName'); + firstName, 'ClientContactEntity', 'firstName'); BuiltValueNullFieldError.checkNotNull( - lastName, 'ContactEntity', 'lastName'); - BuiltValueNullFieldError.checkNotNull(email, 'ContactEntity', 'email'); + lastName, 'ClientContactEntity', 'lastName'); BuiltValueNullFieldError.checkNotNull( - password, 'ContactEntity', 'password'); - BuiltValueNullFieldError.checkNotNull(phone, 'ContactEntity', 'phone'); + email, 'ClientContactEntity', 'email'); BuiltValueNullFieldError.checkNotNull( - contactKey, 'ContactEntity', 'contactKey'); + password, 'ClientContactEntity', 'password'); BuiltValueNullFieldError.checkNotNull( - isPrimary, 'ContactEntity', 'isPrimary'); + phone, 'ClientContactEntity', 'phone'); BuiltValueNullFieldError.checkNotNull( - sendEmail, 'ContactEntity', 'sendEmail'); + contactKey, 'ClientContactEntity', 'contactKey'); BuiltValueNullFieldError.checkNotNull( - customValue1, 'ContactEntity', 'customValue1'); + isPrimary, 'ClientContactEntity', 'isPrimary'); BuiltValueNullFieldError.checkNotNull( - customValue2, 'ContactEntity', 'customValue2'); + sendEmail, 'ClientContactEntity', 'sendEmail'); BuiltValueNullFieldError.checkNotNull( - customValue3, 'ContactEntity', 'customValue3'); + customValue1, 'ClientContactEntity', 'customValue1'); BuiltValueNullFieldError.checkNotNull( - customValue4, 'ContactEntity', 'customValue4'); + customValue2, 'ClientContactEntity', 'customValue2'); BuiltValueNullFieldError.checkNotNull( - lastLogin, 'ContactEntity', 'lastLogin'); - BuiltValueNullFieldError.checkNotNull(link, 'ContactEntity', 'link'); + customValue3, 'ClientContactEntity', 'customValue3'); BuiltValueNullFieldError.checkNotNull( - createdAt, 'ContactEntity', 'createdAt'); + customValue4, 'ClientContactEntity', 'customValue4'); BuiltValueNullFieldError.checkNotNull( - updatedAt, 'ContactEntity', 'updatedAt'); + lastLogin, 'ClientContactEntity', 'lastLogin'); + BuiltValueNullFieldError.checkNotNull(link, 'ClientContactEntity', 'link'); BuiltValueNullFieldError.checkNotNull( - archivedAt, 'ContactEntity', 'archivedAt'); - BuiltValueNullFieldError.checkNotNull(id, 'ContactEntity', 'id'); + createdAt, 'ClientContactEntity', 'createdAt'); + BuiltValueNullFieldError.checkNotNull( + updatedAt, 'ClientContactEntity', 'updatedAt'); + BuiltValueNullFieldError.checkNotNull( + archivedAt, 'ClientContactEntity', 'archivedAt'); + BuiltValueNullFieldError.checkNotNull(id, 'ClientContactEntity', 'id'); } @override - ContactEntity rebuild(void Function(ContactEntityBuilder) updates) => + ClientContactEntity rebuild( + void Function(ClientContactEntityBuilder) updates) => (toBuilder()..update(updates)).build(); @override - ContactEntityBuilder toBuilder() => new ContactEntityBuilder()..replace(this); + ClientContactEntityBuilder toBuilder() => + new ClientContactEntityBuilder()..replace(this); @override bool operator ==(Object other) { if (identical(other, this)) return true; - return other is ContactEntity && + return other is ClientContactEntity && firstName == other.firstName && lastName == other.lastName && email == other.email && @@ -1859,7 +1869,7 @@ class _$ContactEntity extends ContactEntity { @override String toString() { - return (newBuiltValueToStringHelper('ContactEntity') + return (newBuiltValueToStringHelper('ClientContactEntity') ..add('firstName', firstName) ..add('lastName', lastName) ..add('email', email) @@ -1886,9 +1896,9 @@ class _$ContactEntity extends ContactEntity { } } -class ContactEntityBuilder - implements Builder { - _$ContactEntity _$v; +class ClientContactEntityBuilder + implements Builder { + _$ClientContactEntity _$v; String _firstName; String get firstName => _$this._firstName; @@ -1980,9 +1990,9 @@ class ContactEntityBuilder String get id => _$this._id; set id(String id) => _$this._id = id; - ContactEntityBuilder(); + ClientContactEntityBuilder(); - ContactEntityBuilder get _$this { + ClientContactEntityBuilder get _$this { final $v = _$v; if ($v != null) { _firstName = $v.firstName; @@ -2013,52 +2023,51 @@ class ContactEntityBuilder } @override - void replace(ContactEntity other) { + void replace(ClientContactEntity other) { ArgumentError.checkNotNull(other, 'other'); - _$v = other as _$ContactEntity; + _$v = other as _$ClientContactEntity; } @override - void update(void Function(ContactEntityBuilder) updates) { + void update(void Function(ClientContactEntityBuilder) updates) { if (updates != null) updates(this); } @override - _$ContactEntity build() { + _$ClientContactEntity build() { final _$result = _$v ?? - new _$ContactEntity._( + new _$ClientContactEntity._( firstName: BuiltValueNullFieldError.checkNotNull( - firstName, 'ContactEntity', 'firstName'), + firstName, 'ClientContactEntity', 'firstName'), lastName: BuiltValueNullFieldError.checkNotNull( - lastName, 'ContactEntity', 'lastName'), + lastName, 'ClientContactEntity', 'lastName'), email: BuiltValueNullFieldError.checkNotNull( - email, 'ContactEntity', 'email'), + email, 'ClientContactEntity', 'email'), password: BuiltValueNullFieldError.checkNotNull( - password, 'ContactEntity', 'password'), + password, 'ClientContactEntity', 'password'), phone: BuiltValueNullFieldError.checkNotNull( - phone, 'ContactEntity', 'phone'), + phone, 'ClientContactEntity', 'phone'), contactKey: BuiltValueNullFieldError.checkNotNull( - contactKey, 'ContactEntity', 'contactKey'), + contactKey, 'ClientContactEntity', 'contactKey'), isPrimary: BuiltValueNullFieldError.checkNotNull( - isPrimary, 'ContactEntity', 'isPrimary'), + isPrimary, 'ClientContactEntity', 'isPrimary'), sendEmail: BuiltValueNullFieldError.checkNotNull( - sendEmail, 'ContactEntity', 'sendEmail'), - customValue1: BuiltValueNullFieldError.checkNotNull( - customValue1, 'ContactEntity', 'customValue1'), - customValue2: - BuiltValueNullFieldError.checkNotNull(customValue2, 'ContactEntity', 'customValue2'), - customValue3: BuiltValueNullFieldError.checkNotNull(customValue3, 'ContactEntity', 'customValue3'), - customValue4: BuiltValueNullFieldError.checkNotNull(customValue4, 'ContactEntity', 'customValue4'), - lastLogin: BuiltValueNullFieldError.checkNotNull(lastLogin, 'ContactEntity', 'lastLogin'), - link: BuiltValueNullFieldError.checkNotNull(link, 'ContactEntity', 'link'), + sendEmail, 'ClientContactEntity', 'sendEmail'), + customValue1: + BuiltValueNullFieldError.checkNotNull(customValue1, 'ClientContactEntity', 'customValue1'), + customValue2: BuiltValueNullFieldError.checkNotNull(customValue2, 'ClientContactEntity', 'customValue2'), + customValue3: BuiltValueNullFieldError.checkNotNull(customValue3, 'ClientContactEntity', 'customValue3'), + customValue4: BuiltValueNullFieldError.checkNotNull(customValue4, 'ClientContactEntity', 'customValue4'), + lastLogin: BuiltValueNullFieldError.checkNotNull(lastLogin, 'ClientContactEntity', 'lastLogin'), + link: BuiltValueNullFieldError.checkNotNull(link, 'ClientContactEntity', 'link'), isChanged: isChanged, - createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'ContactEntity', 'createdAt'), - updatedAt: BuiltValueNullFieldError.checkNotNull(updatedAt, 'ContactEntity', 'updatedAt'), - archivedAt: BuiltValueNullFieldError.checkNotNull(archivedAt, 'ContactEntity', 'archivedAt'), + createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'ClientContactEntity', 'createdAt'), + updatedAt: BuiltValueNullFieldError.checkNotNull(updatedAt, 'ClientContactEntity', 'updatedAt'), + archivedAt: BuiltValueNullFieldError.checkNotNull(archivedAt, 'ClientContactEntity', 'archivedAt'), isDeleted: isDeleted, createdUserId: createdUserId, assignedUserId: assignedUserId, - id: BuiltValueNullFieldError.checkNotNull(id, 'ContactEntity', 'id')); + id: BuiltValueNullFieldError.checkNotNull(id, 'ClientContactEntity', 'id')); replace(_$result); return _$result; } diff --git a/lib/data/models/entities.dart b/lib/data/models/entities.dart index 4464b6d15..6063b3ada 100644 --- a/lib/data/models/entities.dart +++ b/lib/data/models/entities.dart @@ -476,6 +476,10 @@ abstract class BelongsToClient { String get clientId; } +abstract class BelongsToVendor { + String get vendorId; +} + abstract class ErrorMessage implements Built { factory ErrorMessage([void updates(ErrorMessageBuilder b)]) = _$ErrorMessage; @@ -808,7 +812,7 @@ abstract class ActivityEntity InvoiceEntity recurringInvoice, ExpenseEntity recurringExpense, }) { - ContactEntity contact; + ClientContactEntity contact; if (client != null && contactId != null && contactId.isNotEmpty) { contact = client.getContact(contactId); } diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index 0602135e5..0e93cd41a 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -122,7 +122,12 @@ class InvoiceTotalFields { } abstract class InvoiceEntity extends Object - with BaseEntity, SelectableEntity, CalculateInvoiceTotal, BelongsToClient + with + BaseEntity, + SelectableEntity, + CalculateInvoiceTotal, + BelongsToClient, + BelongsToVendor implements Built { factory InvoiceEntity({ String id, @@ -368,6 +373,7 @@ abstract class InvoiceEntity extends Object @BuiltValueField(wireName: 'project_id') String get projectId; + @override @BuiltValueField(wireName: 'vendor_id') String get vendorId; @@ -1231,12 +1237,18 @@ abstract class InvoiceEntity extends Object .isBefore(DateTime.now().subtract(Duration(days: 1))); } - InvitationEntity getInvitationForContact(ContactEntity contact) { + InvitationEntity getInvitationForClientContact(ClientContactEntity contact) { return invitations.firstWhere( (invitation) => invitation.clientContactId == contact.id, orElse: () => null); } + InvitationEntity getInvitationForVendorContact(VendorContactEntity contact) { + return invitations.firstWhere( + (invitation) => invitation.vendorContactId == contact.id, + orElse: () => null); + } + /// Gets taxes in the form { taxName1: { amount: 0, paid: 0} , ... } Map> getTaxes(int precision) { final taxes = >{}; diff --git a/lib/data/models/serializers.g.dart b/lib/data/models/serializers.g.dart index c021e4043..53af466bf 100644 --- a/lib/data/models/serializers.g.dart +++ b/lib/data/models/serializers.g.dart @@ -13,6 +13,7 @@ Serializers _$serializers = (new Serializers().toBuilder() ..add(AppSidebarMode.serializer) ..add(AppState.serializer) ..add(AuthState.serializer) + ..add(ClientContactEntity.serializer) ..add(ClientEntity.serializer) ..add(ClientItemResponse.serializer) ..add(ClientListResponse.serializer) @@ -26,7 +27,6 @@ Serializers _$serializers = (new Serializers().toBuilder() ..add(CompanyGatewayUIState.serializer) ..add(CompanyItemResponse.serializer) ..add(CompanyPrefState.serializer) - ..add(ContactEntity.serializer) ..add(CountryEntity.serializer) ..add(CountryItemResponse.serializer) ..add(CountryListResponse.serializer) @@ -211,16 +211,10 @@ Serializers _$serializers = (new Serializers().toBuilder() ..add(WebhookListResponse.serializer) ..add(WebhookState.serializer) ..add(WebhookUIState.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(ClientEntity)]), - () => new ListBuilder()) ..addBuilderFactory( const FullType( - BuiltList, const [const FullType(CompanyGatewayEntity)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(ContactEntity)]), - () => new ListBuilder()) + BuiltList, const [const FullType(ClientContactEntity)]), + () => new ListBuilder()) ..addBuilderFactory( const FullType(BuiltList, const [const FullType(ActivityEntity)]), () => new ListBuilder()) @@ -236,6 +230,13 @@ Serializers _$serializers = (new Serializers().toBuilder() ..addBuilderFactory( const FullType(BuiltList, const [const FullType(SystemLogEntity)]), () => new ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(ClientEntity)]), + () => new ListBuilder()) + ..addBuilderFactory( + const FullType( + BuiltList, const [const FullType(CompanyGatewayEntity)]), + () => new ListBuilder()) ..addBuilderFactory( const FullType(BuiltList, const [const FullType(CountryEntity)]), () => new ListBuilder()) diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index c19d30a3a..9e97e482b 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -49,7 +49,7 @@ class EditClient implements PersistUI, PersistPrefs { this.force = false}); final ClientEntity client; - final ContactEntity contact; + final ClientContactEntity contact; final Completer completer; final Completer cancelCompleter; final bool force; @@ -58,7 +58,7 @@ class EditClient implements PersistUI, PersistPrefs { class EditContact implements PersistUI { EditContact([this.contact]); - final ContactEntity contact; + final ClientContactEntity contact; } class ShowPdfClient { @@ -146,14 +146,14 @@ class LoadClientsSuccess implements StopLoading { class AddContact implements PersistUI { AddContact([this.contact]); - final ContactEntity contact; + final ClientContactEntity contact; } class UpdateContact implements PersistUI { UpdateContact({this.index, this.contact}); final int index; - final ContactEntity contact; + final ClientContactEntity contact; } class DeleteContact implements PersistUI { diff --git a/lib/redux/client/client_reducer.dart b/lib/redux/client/client_reducer.dart index 1643366a4..33dd0e9d5 100644 --- a/lib/redux/client/client_reducer.dart +++ b/lib/redux/client/client_reducer.dart @@ -59,12 +59,12 @@ final cancelCompleterReducer = combineReducers>([ }), ]); -final editingContactReducer = combineReducers([ - TypedReducer((contact, action) { - return action.contact ?? ContactEntity(); +final editingContactReducer = combineReducers([ + TypedReducer((contact, action) { + return action.contact ?? ClientContactEntity(); }), - TypedReducer((contact, action) { - return action.contact ?? ContactEntity(); + TypedReducer((contact, action) { + return action.contact ?? ClientContactEntity(); }), ]); @@ -123,8 +123,8 @@ final editingReducer = combineReducers([ return action.client.rebuild((b) => b..isChanged = true); }), TypedReducer((client, action) { - return client - .rebuild((b) => b..contacts.add(action.contact ?? ContactEntity())); + return client.rebuild( + (b) => b..contacts.add(action.contact ?? ClientContactEntity())); }), TypedReducer((client, action) { return client.rebuild((b) => b..contacts.removeAt(action.index)); diff --git a/lib/redux/client/client_state.dart b/lib/redux/client/client_state.dart index de82d49d2..0e3e47f82 100644 --- a/lib/redux/client/client_state.dart +++ b/lib/redux/client/client_state.dart @@ -63,7 +63,7 @@ abstract class ClientUIState extends Object listUIState: ListUIState(sortField?.field ?? ClientFields.name, sortAscending: sortField?.ascending), editing: ClientEntity(), - editingContact: ContactEntity(), + editingContact: ClientContactEntity(), saveCompleter: null, tabIndex: 0, ); @@ -79,7 +79,7 @@ abstract class ClientUIState extends Object ClientEntity get editing; @nullable - ContactEntity get editingContact; + ClientContactEntity get editingContact; @override bool get isCreatingNew => editing.isNew; diff --git a/lib/redux/client/client_state.g.dart b/lib/redux/client/client_state.g.dart index 9c96acfb5..22d2c9563 100644 --- a/lib/redux/client/client_state.g.dart +++ b/lib/redux/client/client_state.g.dart @@ -94,7 +94,7 @@ class _$ClientUIStateSerializer implements StructuredSerializer { result ..add('editingContact') ..add(serializers.serialize(value, - specifiedType: const FullType(ContactEntity))); + specifiedType: const FullType(ClientContactEntity))); } value = object.selectedId; if (value != null) { @@ -131,7 +131,8 @@ class _$ClientUIStateSerializer implements StructuredSerializer { break; case 'editingContact': result.editingContact.replace(serializers.deserialize(value, - specifiedType: const FullType(ContactEntity)) as ContactEntity); + specifiedType: const FullType(ClientContactEntity)) + as ClientContactEntity); break; case 'listUIState': result.listUIState.replace(serializers.deserialize(value, @@ -261,7 +262,7 @@ class _$ClientUIState extends ClientUIState { @override final ClientEntity editing; @override - final ContactEntity editingContact; + final ClientContactEntity editingContact; @override final ListUIState listUIState; @override @@ -358,10 +359,10 @@ class ClientUIStateBuilder _$this._editing ??= new ClientEntityBuilder(); set editing(ClientEntityBuilder editing) => _$this._editing = editing; - ContactEntityBuilder _editingContact; - ContactEntityBuilder get editingContact => - _$this._editingContact ??= new ContactEntityBuilder(); - set editingContact(ContactEntityBuilder editingContact) => + ClientContactEntityBuilder _editingContact; + ClientContactEntityBuilder get editingContact => + _$this._editingContact ??= new ClientContactEntityBuilder(); + set editingContact(ClientContactEntityBuilder editingContact) => _$this._editingContact = editingContact; ListUIStateBuilder _listUIState; diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index 81fd3e33a..89a18c5ca 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -150,7 +150,7 @@ class LoadCreditsSuccess implements StopLoading { class AddCreditContact implements PersistUI { AddCreditContact({this.contact, this.invitation}); - final ContactEntity contact; + final ClientContactEntity contact; final InvitationEntity invitation; } diff --git a/lib/redux/credit/credit_reducer.dart b/lib/redux/credit/credit_reducer.dart index e60552cfc..67e099bd9 100644 --- a/lib/redux/credit/credit_reducer.dart +++ b/lib/redux/credit/credit_reducer.dart @@ -117,7 +117,7 @@ final editingReducer = combineReducers([ return credit.rebuild((b) => b ..isChanged = true ..clientId = client?.id ?? '' - ..invitations.replace((client?.emailContacts ?? []) + ..invitations.replace((client?.emailContacts ?? []) .map((contact) => InvitationEntity(clientContactId: contact.id)) .toList())); }), diff --git a/lib/redux/credit/credit_selectors.dart b/lib/redux/credit/credit_selectors.dart index ee525c254..db5551bb2 100644 --- a/lib/redux/credit/credit_selectors.dart +++ b/lib/redux/credit/credit_selectors.dart @@ -7,7 +7,8 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -ContactEntity creditContactSelector(InvoiceEntity credit, ClientEntity client) { +ClientContactEntity creditContactSelector( + InvoiceEntity credit, ClientEntity client) { var contactIds = credit.invitations .map((invitation) => invitation.clientContactId) .toList(); diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index 5e8fc8623..55b8781e1 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -151,7 +151,7 @@ class LoadInvoicesSuccess implements StopLoading { class AddInvoiceContact implements PersistUI { AddInvoiceContact({this.contact, this.invitation}); - final ContactEntity contact; + final ClientContactEntity contact; final InvitationEntity invitation; } diff --git a/lib/redux/invoice/invoice_reducer.dart b/lib/redux/invoice/invoice_reducer.dart index 68cf1b1bf..c405cc3ae 100644 --- a/lib/redux/invoice/invoice_reducer.dart +++ b/lib/redux/invoice/invoice_reducer.dart @@ -121,7 +121,7 @@ final editingReducer = combineReducers([ return invoice.rebuild((b) => b ..isChanged = true ..clientId = client?.id ?? '' - ..invitations.replace((client?.emailContacts ?? []) + ..invitations.replace((client?.emailContacts ?? []) .map((contact) => InvitationEntity(clientContactId: contact.id)) .toList())); }), diff --git a/lib/redux/invoice/invoice_selectors.dart b/lib/redux/invoice/invoice_selectors.dart index 3fe779c6f..be74fa3d8 100644 --- a/lib/redux/invoice/invoice_selectors.dart +++ b/lib/redux/invoice/invoice_selectors.dart @@ -18,7 +18,7 @@ InvoiceEntity invoiceQuoteSelector( return invoiceQuote; } -ContactEntity invoiceContactSelector( +ClientContactEntity invoiceContactSelector( InvoiceEntity invoice, ClientEntity client) { var contactIds = invoice.invitations .map((invitation) => invitation.clientContactId) diff --git a/lib/redux/purchase_order/purchase_order_actions.dart b/lib/redux/purchase_order/purchase_order_actions.dart index 7bf5d9d4d..273a82f7f 100644 --- a/lib/redux/purchase_order/purchase_order_actions.dart +++ b/lib/redux/purchase_order/purchase_order_actions.dart @@ -297,7 +297,7 @@ class ApprovePurchaseOrderFailure implements StopSaving { class AddPurchaseOrderContact implements PersistUI { AddPurchaseOrderContact({this.contact, this.invitation}); - final ContactEntity contact; + final VendorContactEntity contact; final InvitationEntity invitation; } diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index ac0bd8520..73389ab86 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -150,7 +150,7 @@ class LoadQuotesSuccess implements StopLoading { class AddQuoteContact implements PersistUI { AddQuoteContact({this.contact, this.invitation}); - final ContactEntity contact; + final ClientContactEntity contact; final InvitationEntity invitation; } diff --git a/lib/redux/quote/quote_reducer.dart b/lib/redux/quote/quote_reducer.dart index 550f6bf38..912d9b3f1 100644 --- a/lib/redux/quote/quote_reducer.dart +++ b/lib/redux/quote/quote_reducer.dart @@ -118,7 +118,7 @@ final editingReducer = combineReducers([ return quote.rebuild((b) => b ..isChanged = true ..clientId = client?.id ?? '' - ..invitations.replace((client?.emailContacts ?? []) + ..invitations.replace((client?.emailContacts ?? []) .map((contact) => InvitationEntity(clientContactId: contact.id)) .toList())); }), diff --git a/lib/redux/quote/quote_selectors.dart b/lib/redux/quote/quote_selectors.dart index 3a707ec36..69d12e789 100644 --- a/lib/redux/quote/quote_selectors.dart +++ b/lib/redux/quote/quote_selectors.dart @@ -12,7 +12,8 @@ ClientEntity quoteClientSelector( return clientMap[quote.clientId]; } -ContactEntity quoteContactSelector(InvoiceEntity quote, ClientEntity client) { +ClientContactEntity quoteContactSelector( + InvoiceEntity quote, ClientEntity client) { var contactIds = quote.invitations .map((invitation) => invitation.clientContactId) .toList(); diff --git a/lib/redux/recurring_invoice/recurring_invoice_actions.dart b/lib/redux/recurring_invoice/recurring_invoice_actions.dart index 49040a767..5ec46d58d 100644 --- a/lib/redux/recurring_invoice/recurring_invoice_actions.dart +++ b/lib/redux/recurring_invoice/recurring_invoice_actions.dart @@ -159,7 +159,7 @@ class LoadRecurringInvoicesSuccess implements StopLoading { class AddRecurringInvoiceContact implements PersistUI { AddRecurringInvoiceContact({this.contact, this.invitation}); - final ContactEntity contact; + final ClientContactEntity contact; final InvitationEntity invitation; } diff --git a/lib/redux/recurring_invoice/recurring_invoice_reducer.dart b/lib/redux/recurring_invoice/recurring_invoice_reducer.dart index a8202c09e..5d3c69d60 100644 --- a/lib/redux/recurring_invoice/recurring_invoice_reducer.dart +++ b/lib/redux/recurring_invoice/recurring_invoice_reducer.dart @@ -144,7 +144,7 @@ final editingReducer = combineReducers([ return recurringInvoice.rebuild((b) => b ..isChanged = true ..clientId = client?.id ?? '' - ..invitations.replace((client?.emailContacts ?? []) + ..invitations.replace((client?.emailContacts ?? []) .map((contact) => InvitationEntity(clientContactId: contact.id)) .toList())); }), diff --git a/lib/redux/vendor/vendor_reducer.dart b/lib/redux/vendor/vendor_reducer.dart index 6bf3d27bb..817835941 100644 --- a/lib/redux/vendor/vendor_reducer.dart +++ b/lib/redux/vendor/vendor_reducer.dart @@ -66,7 +66,7 @@ final editingVendorContactReducer = combineReducers([ VendorContactEntity editVendorContact( VendorContactEntity contact, dynamic action) { - return action.contact ?? VendorContactEntity(); + return action.clientContact ?? VendorContactEntity(); } Reducer selectedIdReducer = combineReducers([ diff --git a/lib/ui/client/edit/client_edit_contacts.dart b/lib/ui/client/edit/client_edit_contacts.dart index dfe70147b..a4641838a 100644 --- a/lib/ui/client/edit/client_edit_contacts.dart +++ b/lib/ui/client/edit/client_edit_contacts.dart @@ -31,9 +31,9 @@ class ClientEditContacts extends StatefulWidget { } class _ClientEditContactsState extends State { - ContactEntity selectedContact; + ClientContactEntity selectedContact; - void _showContactEditor(ContactEntity contact, BuildContext context) { + void _showContactEditor(ClientContactEntity contact, BuildContext context) { showDialog( context: context, builder: (BuildContext context) { @@ -130,7 +130,7 @@ class ContactListTile extends StatelessWidget { }); final Function onTap; - final ContactEntity contact; + final ClientContactEntity contact; @override Widget build(BuildContext context) { @@ -172,7 +172,7 @@ class ContactEditDetails extends StatefulWidget { }) : super(key: key); final int index; - final ContactEntity contact; + final ClientContactEntity contact; final ClientEditContactsVM viewModel; final ClientEditVM clientViewModel; final bool isDialog; @@ -194,7 +194,7 @@ class ContactEditDetailsState extends State { final _debouncer = Debouncer(); List _controllers = []; - ContactEntity _contact; + ClientContactEntity _contact; void _onDoneContactPressed() { if (widget.isDialog) { diff --git a/lib/ui/client/edit/client_edit_contacts_vm.dart b/lib/ui/client/edit/client_edit_contacts_vm.dart index 348cd412b..494678393 100644 --- a/lib/ui/client/edit/client_edit_contacts_vm.dart +++ b/lib/ui/client/edit/client_edit_contacts_vm.dart @@ -54,7 +54,7 @@ class ClientEditContactsVM { client: client, contact: state.clientUIState.editingContact, onAddContactPressed: () { - final contact = ContactEntity(); + final contact = ClientContactEntity(); store.dispatch(AddContact(contact)); store.dispatch(EditContact(contact)); }, @@ -69,9 +69,9 @@ class ClientEditContactsVM { final CompanyEntity company; final ClientEntity client; - final ContactEntity contact; + final ClientContactEntity contact; final Function() onAddContactPressed; final Function(int) onRemoveContactPressed; final Function(BuildContext) onDoneContactPressed; - final Function(ContactEntity, int) onChangedContact; + final Function(ClientContactEntity, int) onChangedContact; } diff --git a/lib/ui/invoice/edit/invoice_edit_contacts.dart b/lib/ui/invoice/edit/invoice_edit_contacts.dart index 17c90339d..f09dde14c 100644 --- a/lib/ui/invoice/edit/invoice_edit_contacts.dart +++ b/lib/ui/invoice/edit/invoice_edit_contacts.dart @@ -24,7 +24,7 @@ class InvoiceEditContacts extends StatelessWidget { final invoice = viewModel.invoice; final client = viewModel.client; - List contacts; + List contacts; if (client == null) { if (viewModel.state.prefState.isDesktop) { contacts = []; @@ -46,13 +46,13 @@ class InvoiceEditContacts extends StatelessWidget { return ScrollableListView( children: contacts.map((contact) { - final invitation = invoice.getInvitationForContact(contact); + final invitation = invoice.getInvitationForClientContact(contact); return _ContactListTile( - contact: contact, + clientContact: contact, invoice: invoice, invitation: invitation, onTap: () => invitation == null - ? viewModel.onAddContact(contact) + ? viewModel.onAddClientContact(contact) : viewModel.onRemoveContact(invitation), ); }).toList(), @@ -62,14 +62,14 @@ class InvoiceEditContacts extends StatelessWidget { class _ContactListTile extends StatelessWidget { const _ContactListTile({ - this.contact, + this.clientContact, this.invoice, this.invitation, this.onTap, }); final InvoiceEntity invoice; - final ContactEntity contact; + final ClientContactEntity clientContact; final InvitationEntity invitation; final Function onTap; @@ -78,10 +78,10 @@ class _ContactListTile extends StatelessWidget { final localization = AppLocalization.of(context); return ListTile( - title: Text(contact.fullName.isNotEmpty - ? contact.fullName + title: Text(clientContact.fullName.isNotEmpty + ? clientContact.fullName : AppLocalization.of(context).blankContact), - subtitle: contact.email != null ? Text(contact.email) : null, + subtitle: clientContact.email != null ? Text(clientContact.email) : null, onTap: onTap, leading: IgnorePointer( child: Checkbox( diff --git a/lib/ui/invoice/edit/invoice_edit_contacts_vm.dart b/lib/ui/invoice/edit/invoice_edit_contacts_vm.dart index b7eca6e15..cd25533e2 100644 --- a/lib/ui/invoice/edit/invoice_edit_contacts_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_contacts_vm.dart @@ -42,7 +42,9 @@ class EntityEditContactsVM { @required this.company, @required this.invoice, @required this.client, - @required this.onAddContact, + @required this.vendor, + @required this.onAddClientContact, + @required this.onAddVendorContact, @required this.onRemoveContact, }); @@ -50,7 +52,9 @@ class EntityEditContactsVM { final CompanyEntity company; final InvoiceEntity invoice; final ClientEntity client; - final Function(ContactEntity) onAddContact; + final VendorEntity vendor; + final Function(ClientContactEntity) onAddClientContact; + final Function(VendorContactEntity) onAddVendorContact; final Function(InvitationEntity) onRemoveContact; } @@ -60,14 +64,18 @@ class InvoiceEditContactsVM extends EntityEditContactsVM { @required CompanyEntity company, @required InvoiceEntity invoice, @required ClientEntity client, - @required Function(ContactEntity) onAddContact, + @required VendorEntity vendor, + @required Function(ClientContactEntity) onAddClientContact, + @required Function(VendorContactEntity) onAddVendorContact, @required Function(InvitationEntity) onRemoveContact, }) : super( state: state, company: company, invoice: invoice, client: client, - onAddContact: onAddContact, + vendor: vendor, + onAddClientContact: onAddClientContact, + onAddVendorContact: onAddVendorContact, onRemoveContact: onRemoveContact, ); @@ -96,13 +104,14 @@ class InvoiceEditContactsVM extends EntityEditContactsVM { company: state.company, invoice: entity, client: state.clientState.map[(entity as BelongsToClient).clientId], - onAddContact: (ContactEntity contact) { + vendor: state.vendorState.map[(entity as BelongsToVendor).vendorId], + onAddClientContact: (ClientContactEntity contact) { InvitationEntity invitation; // prevent un-checking/checking a contact from creating a new invitation if (entity.isOld) { final origEntity = state.getEntityMap(entityType)[entity.id] as InvoiceEntity; - invitation = origEntity.getInvitationForContact(contact); + invitation = origEntity.getInvitationForClientContact(contact); } if (entity.entityType == EntityType.quote) { @@ -117,7 +126,21 @@ class InvoiceEditContactsVM extends EntityEditContactsVM { } else if (entity.entityType == EntityType.invoice) { store.dispatch( AddInvoiceContact(contact: contact, invitation: invitation)); - } else if (entity.entityType == EntityType.purchaseOrder) { + } else { + print( + 'ERROR: entityType $entityType not handled in invoice_edit_contacts_vm'); + } + }, + onAddVendorContact: (VendorContactEntity contact) { + InvitationEntity invitation; + // prevent un-checking/checking a contact from creating a new invitation + if (entity.isOld) { + final origEntity = + state.getEntityMap(entityType)[entity.id] as InvoiceEntity; + invitation = origEntity.getInvitationForVendorContact(contact); + } + + if (entity.entityType == EntityType.purchaseOrder) { store.dispatch(AddPurchaseOrderContact( contact: contact, invitation: invitation)); } else { diff --git a/lib/ui/invoice/view/invoice_view_contacts.dart b/lib/ui/invoice/view/invoice_view_contacts.dart index 83212c5c9..4508aaf67 100644 --- a/lib/ui/invoice/view/invoice_view_contacts.dart +++ b/lib/ui/invoice/view/invoice_view_contacts.dart @@ -47,7 +47,7 @@ class _InvitationListTile extends StatelessWidget { final client = state.clientState.get(viewModel.invoice.clientId); final contact = client.contacts.firstWhere( (contact) => contact.id == invitation.clientContactId, - orElse: () => ContactEntity()); + orElse: () => ClientContactEntity()); if (contact.isNew) { return SizedBox();