@zeniai/client-epic-state 5.2.11 → 5.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/entity/invoicing/invoicingCommonPayload.d.ts +27 -29
- package/lib/entity/invoicing/invoicingCommonPayload.js +37 -75
- package/lib/entity/invoicing/product/productPayload.d.ts +10 -0
- package/lib/entity/invoicing/product/productPayload.js +14 -2
- package/lib/epic.d.ts +1 -1
- package/lib/epic.js +10 -5
- package/lib/esm/entity/invoicing/invoicingCommonPayload.js +33 -73
- package/lib/esm/entity/invoicing/product/productPayload.js +14 -2
- package/lib/esm/epic.js +6 -1
- package/lib/esm/index.js +5 -4
- package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +25 -9
- package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +6 -1
- package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +40 -0
- package/lib/esm/view/invoicing/settingsView/epics/connectInvoicingStripeEpic.js +27 -0
- package/lib/esm/view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic.js +19 -0
- package/lib/esm/view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic.js +19 -0
- package/lib/esm/view/invoicing/settingsView/epics/saveInvoicingSettingsEpic.js +39 -0
- package/lib/esm/view/invoicing/settingsView/epics/settingsViewActionType.js +1 -0
- package/lib/esm/view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic.js +25 -0
- package/lib/esm/view/invoicing/settingsView/invoicingQboSettingsFormConfig.js +48 -0
- package/lib/esm/view/invoicing/settingsView/settingsViewReducer.js +25 -1
- package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +41 -0
- package/lib/index.d.ts +7 -5
- package/lib/index.js +13 -6
- package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +1 -1
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.d.ts +12 -1
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +25 -9
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +6 -1
- package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.d.ts +10 -1
- package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +43 -1
- package/lib/view/invoicing/settingsView/epics/connectInvoicingStripeEpic.d.ts +6 -0
- package/lib/view/invoicing/settingsView/epics/connectInvoicingStripeEpic.js +31 -0
- package/lib/view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic.d.ts +6 -0
- package/lib/view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic.js +23 -0
- package/lib/view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic.d.ts +6 -0
- package/lib/view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic.js +23 -0
- package/lib/view/invoicing/settingsView/epics/saveInvoicingSettingsEpic.d.ts +6 -0
- package/lib/view/invoicing/settingsView/epics/saveInvoicingSettingsEpic.js +43 -0
- package/lib/view/invoicing/settingsView/epics/settingsViewActionType.d.ts +5 -0
- package/lib/view/invoicing/settingsView/epics/settingsViewActionType.js +2 -0
- package/lib/view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic.d.ts +11 -0
- package/lib/view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic.js +29 -0
- package/lib/view/invoicing/settingsView/invoicingQboSettingsFormConfig.d.ts +34 -0
- package/lib/view/invoicing/settingsView/invoicingQboSettingsFormConfig.js +53 -0
- package/lib/view/invoicing/settingsView/settingsViewReducer.d.ts +4 -1
- package/lib/view/invoicing/settingsView/settingsViewReducer.js +26 -2
- package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +35 -0
- package/lib/view/invoicing/settingsView/settingsViewSelector.js +43 -1
- package/lib/view/invoicing/settingsView/settingsViewState.d.ts +8 -0
- package/package.json +1 -1
- package/lib/esm/view/invoicing/settingsView/settingsViewEpics.js +0 -92
- package/lib/view/invoicing/settingsView/settingsViewEpics.d.ts +0 -12
- package/lib/view/invoicing/settingsView/settingsViewEpics.js +0 -99
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { AccountBasePayload } from '../account/accountPayload';
|
|
2
|
+
import { AccountBase } from '../account/accountState';
|
|
1
3
|
import { AddressPayload } from '../address/addressPayload';
|
|
2
4
|
export type InvoicingPriceType = 'tax_exclusive' | 'tax_inclusive';
|
|
3
5
|
export declare const INVOICING_DUNNING_ACTIONS: readonly ["email_only", "email_and_retry", "do_nothing", "retry_only"];
|
|
@@ -92,42 +94,38 @@ export declare function toInvoicingQboCustomerMatchingMode(value: string): Invoi
|
|
|
92
94
|
* A mapped account as the newer settings payload returns it: the platform id,
|
|
93
95
|
* plus hydrated fields the client only displays.
|
|
94
96
|
*/
|
|
95
|
-
export interface InvoicingQboMappedAccountPayload {
|
|
96
|
-
account_id?: string | null;
|
|
97
|
-
account_name?: string | null;
|
|
98
|
-
fully_qualified_name?: string | null;
|
|
99
|
-
qbo_id?: string | null;
|
|
100
|
-
}
|
|
101
97
|
/**
|
|
102
|
-
* Account mappings
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
98
|
+
* Account mappings as the service stores them: one entry per mapping kind the
|
|
99
|
+
* config API defines, keyed by that kind's code (`deposit_account`,
|
|
100
|
+
* `default_income_account`, …). The value is the whole account, or just its id
|
|
101
|
+
* for a tenant whose backend has not rolled — both are read, and a save writes
|
|
102
|
+
* the record.
|
|
103
|
+
*
|
|
104
|
+
* An index signature rather than a field list, because the config owns which
|
|
105
|
+
* kinds exist: enumerating them here means a kind it adds gets dropped.
|
|
107
106
|
*/
|
|
108
|
-
export
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
discounts_account_id?: string | null;
|
|
116
|
-
rounding_account?: InvoicingQboMappedAccountPayload | null;
|
|
117
|
-
rounding_account_id?: string | null;
|
|
118
|
-
write_off_account?: InvoicingQboMappedAccountPayload | null;
|
|
119
|
-
write_off_account_id?: string | null;
|
|
120
|
-
}
|
|
107
|
+
export type InvoicingQboAccountMappingsPayload = Record<string, Partial<AccountBasePayload> | string | null>;
|
|
108
|
+
/**
|
|
109
|
+
* The first id a picker can actually select. Callers list the QuickBooks id
|
|
110
|
+
* first: the options are keyed on it, so a platform id selects nothing even when
|
|
111
|
+
* it names the same record. Blank counts as absent.
|
|
112
|
+
*/
|
|
113
|
+
export declare const firstSelectableInvoicingId: (candidates: readonly (string | null | undefined)[]) => string | undefined;
|
|
121
114
|
/**
|
|
122
|
-
*
|
|
123
|
-
* `
|
|
115
|
+
* The slot a mapping code names. Codes arrive from the config API as the slot
|
|
116
|
+
* itself (`deposit_account`); a trailing `_id` is tolerated so a tenant sending
|
|
117
|
+
* the older `deposit_account_id` resolves to the same mapping.
|
|
124
118
|
*/
|
|
119
|
+
export declare const toInvoicingQboAccountMappingSlot: (code: string) => string;
|
|
120
|
+
/** Read one account-mapping dropdown value by its config `code`. */
|
|
125
121
|
export declare function getInvoicingQboAccountMappingId(accountMappings: InvoicingQboAccountMappingsPayload | undefined, code: string): string | undefined;
|
|
126
122
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
123
|
+
* Build the `account_mappings` request body from the ids the pickers submitted.
|
|
124
|
+
* Each kind is sent as the whole account, which is what the service stores; an
|
|
125
|
+
* id that resolves to no account is sent as it stands rather than dropped, so a
|
|
126
|
+
* save never silently unsets a mapping it could not expand.
|
|
129
127
|
*/
|
|
130
|
-
export declare
|
|
128
|
+
export declare const toInvoicingQboAccountMappingsPayload: (accountIdByMappingCode: Record<string, string>, accountForId: (accountId: string) => AccountBase | undefined) => InvoicingQboAccountMappingsPayload;
|
|
131
129
|
export interface InvoicingQboSettingsPayload {
|
|
132
130
|
account_mappings?: InvoicingQboAccountMappingsPayload | null;
|
|
133
131
|
auto_create_items?: boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ALL_INVOICING_FIELD_HELP_GROUPS = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.INVOICING_DISCOUNT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_PRODUCT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_ITEM_LIFECYCLE_ACTIONS = exports.INVOICING_SUBSCRIPTION_LIFECYCLE_ACTIONS = exports.INVOICING_DUNNING_ACTIONS = void 0;
|
|
3
|
+
exports.ALL_INVOICING_FIELD_HELP_GROUPS = exports.toInvoicingQboAccountMappingsPayload = exports.toInvoicingQboAccountMappingSlot = exports.firstSelectableInvoicingId = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.INVOICING_DISCOUNT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_PRODUCT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_ITEM_LIFECYCLE_ACTIONS = exports.INVOICING_SUBSCRIPTION_LIFECYCLE_ACTIONS = exports.INVOICING_DUNNING_ACTIONS = void 0;
|
|
4
4
|
exports.toInvoicingDunningAction = toInvoicingDunningAction;
|
|
5
5
|
exports.toInvoicingSubscriptionLifecycleAction = toInvoicingSubscriptionLifecycleAction;
|
|
6
6
|
exports.toInvoicingSubscriptionLifecycleActionOption = toInvoicingSubscriptionLifecycleActionOption;
|
|
@@ -12,7 +12,6 @@ exports.toInvoicingDiscountLifecycleAction = toInvoicingDiscountLifecycleAction;
|
|
|
12
12
|
exports.toInvoicingDiscountLifecycleActionOption = toInvoicingDiscountLifecycleActionOption;
|
|
13
13
|
exports.toInvoicingQboCustomerMatchingMode = toInvoicingQboCustomerMatchingMode;
|
|
14
14
|
exports.getInvoicingQboAccountMappingId = getInvoicingQboAccountMappingId;
|
|
15
|
-
exports.withInvoicingQboAccountMappingId = withInvoicingQboAccountMappingId;
|
|
16
15
|
exports.toInvoicingQboAccountMappingKindOption = toInvoicingQboAccountMappingKindOption;
|
|
17
16
|
exports.toInvoicingNamedOption = toInvoicingNamedOption;
|
|
18
17
|
exports.toInvoicingFormOption = toInvoicingFormOption;
|
|
@@ -23,6 +22,7 @@ exports.toInvoicingSubscriptionEditFieldOption = toInvoicingSubscriptionEditFiel
|
|
|
23
22
|
exports.toAuditLogEntityRouteOption = toAuditLogEntityRouteOption;
|
|
24
23
|
exports.buildInvoicingEntityPath = buildInvoicingEntityPath;
|
|
25
24
|
exports.isInvoicingEntityLinkable = isInvoicingEntityLinkable;
|
|
25
|
+
const accountPayload_1 = require("../account/accountPayload");
|
|
26
26
|
exports.INVOICING_DUNNING_ACTIONS = [
|
|
27
27
|
'email_only',
|
|
28
28
|
'email_and_retry',
|
|
@@ -154,87 +154,49 @@ function toInvoicingQboCustomerMatchingMode(value) {
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
/**
|
|
157
|
-
* The id
|
|
158
|
-
*
|
|
159
|
-
*
|
|
157
|
+
* The first id a picker can actually select. Callers list the QuickBooks id
|
|
158
|
+
* first: the options are keyed on it, so a platform id selects nothing even when
|
|
159
|
+
* it names the same record. Blank counts as absent.
|
|
160
160
|
*/
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
// internal `account_id` would not select anything even when it is the same
|
|
164
|
-
// account. Both are read because the mapping arrives either way depending on
|
|
165
|
-
// how it was saved.
|
|
166
|
-
const candidates = [
|
|
167
|
-
mappedAccount?.qbo_id,
|
|
168
|
-
mappedAccount?.account_id,
|
|
169
|
-
legacyAccountId,
|
|
170
|
-
];
|
|
171
|
-
return candidates.find((candidate) => candidate != null && candidate !== '');
|
|
172
|
-
}
|
|
161
|
+
const firstSelectableInvoicingId = (candidates) => candidates.find((candidate) => candidate != null && candidate !== '');
|
|
162
|
+
exports.firstSelectableInvoicingId = firstSelectableInvoicingId;
|
|
173
163
|
/**
|
|
174
|
-
*
|
|
175
|
-
* `
|
|
164
|
+
* The slot a mapping code names. Codes arrive from the config API as the slot
|
|
165
|
+
* itself (`deposit_account`); a trailing `_id` is tolerated so a tenant sending
|
|
166
|
+
* the older `deposit_account_id` resolves to the same mapping.
|
|
176
167
|
*/
|
|
168
|
+
const toInvoicingQboAccountMappingSlot = (code) => code.replace(/_id$/, '');
|
|
169
|
+
exports.toInvoicingQboAccountMappingSlot = toInvoicingQboAccountMappingSlot;
|
|
170
|
+
/** Read one account-mapping dropdown value by its config `code`. */
|
|
177
171
|
function getInvoicingQboAccountMappingId(accountMappings, code) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return readInvoicingQboMappedAccountId(accountMappings?.discounts_account, accountMappings?.discounts_account_id);
|
|
185
|
-
case 'rounding_account_id':
|
|
186
|
-
return readInvoicingQboMappedAccountId(accountMappings?.rounding_account, accountMappings?.rounding_account_id);
|
|
187
|
-
case 'write_off_account_id':
|
|
188
|
-
return readInvoicingQboMappedAccountId(accountMappings?.write_off_account, accountMappings?.write_off_account_id);
|
|
189
|
-
default:
|
|
190
|
-
return undefined;
|
|
172
|
+
const slotKey = (0, exports.toInvoicingQboAccountMappingSlot)(code);
|
|
173
|
+
// Either key: the service sends `deposit_account`, but an older payload put
|
|
174
|
+
// the id under `deposit_account_id`.
|
|
175
|
+
const slot = accountMappings?.[slotKey] ?? accountMappings?.[`${slotKey}_id`];
|
|
176
|
+
if (typeof slot === 'string') {
|
|
177
|
+
return slot !== '' ? slot : undefined;
|
|
191
178
|
}
|
|
179
|
+
return (0, exports.firstSelectableInvoicingId)([slot?.qbo_id, slot?.account_id]);
|
|
192
180
|
}
|
|
193
181
|
/**
|
|
194
|
-
*
|
|
195
|
-
*
|
|
182
|
+
* Build the `account_mappings` request body from the ids the pickers submitted.
|
|
183
|
+
* Each kind is sent as the whole account, which is what the service stores; an
|
|
184
|
+
* id that resolves to no account is sent as it stands rather than dropped, so a
|
|
185
|
+
* save never silently unsets a mapping it could not expand.
|
|
196
186
|
*/
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
case 'default_income_account_id':
|
|
211
|
-
return {
|
|
212
|
-
...base,
|
|
213
|
-
default_income_account: undefined,
|
|
214
|
-
default_income_account_id: accountId,
|
|
215
|
-
};
|
|
216
|
-
case 'discounts_account_id':
|
|
217
|
-
return {
|
|
218
|
-
...base,
|
|
219
|
-
discounts_account: undefined,
|
|
220
|
-
discounts_account_id: accountId,
|
|
221
|
-
};
|
|
222
|
-
case 'rounding_account_id':
|
|
223
|
-
return {
|
|
224
|
-
...base,
|
|
225
|
-
rounding_account: undefined,
|
|
226
|
-
rounding_account_id: accountId,
|
|
227
|
-
};
|
|
228
|
-
case 'write_off_account_id':
|
|
229
|
-
return {
|
|
230
|
-
...base,
|
|
231
|
-
write_off_account: undefined,
|
|
232
|
-
write_off_account_id: accountId,
|
|
233
|
-
};
|
|
234
|
-
default:
|
|
235
|
-
return base;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
187
|
+
const toInvoicingQboAccountMappingsPayload = (accountIdByMappingCode, accountForId) => {
|
|
188
|
+
const mappings = {};
|
|
189
|
+
Object.entries(accountIdByMappingCode).forEach(([code, accountId]) => {
|
|
190
|
+
if (accountId === '') {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const account = accountForId(accountId);
|
|
194
|
+
mappings[(0, exports.toInvoicingQboAccountMappingSlot)(code)] =
|
|
195
|
+
account != null ? (0, accountPayload_1.toAccountPayload)(account) : accountId;
|
|
196
|
+
});
|
|
197
|
+
return mappings;
|
|
198
|
+
};
|
|
199
|
+
exports.toInvoicingQboAccountMappingsPayload = toInvoicingQboAccountMappingsPayload;
|
|
238
200
|
function toInvoicingQboAccountMappingKindOption(option) {
|
|
239
201
|
return {
|
|
240
202
|
accountTypes: option.account_types,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { AccountBasePayload } from '../../account/accountPayload';
|
|
2
|
+
import { ClassBasePayload } from '../../class/classPayload';
|
|
1
3
|
import { InvoicingPlanTier, InvoicingProduct } from './productState';
|
|
2
4
|
export interface InvoicingPlanTierPayload {
|
|
3
5
|
price: number;
|
|
@@ -7,10 +9,18 @@ export interface InvoicingPlanTierPayload {
|
|
|
7
9
|
pricing_type?: string;
|
|
8
10
|
}
|
|
9
11
|
export interface InvoicingAccountingDetailPayload {
|
|
12
|
+
/**
|
|
13
|
+
* `account` and `accounting_class` hold whole records — what the service stores
|
|
14
|
+
* and what the catalog payload builder sends. The bare `accounting_code` /
|
|
15
|
+
* `accounting_category_1` are the older shape, still read so a plan saved
|
|
16
|
+
* before the rollover prefills.
|
|
17
|
+
*/
|
|
18
|
+
account?: Partial<AccountBasePayload> | null;
|
|
10
19
|
accounting_category_1?: string;
|
|
11
20
|
accounting_category_2?: string;
|
|
12
21
|
accounting_category_3?: string;
|
|
13
22
|
accounting_category_4?: string;
|
|
23
|
+
accounting_class?: Partial<ClassBasePayload> | null;
|
|
14
24
|
accounting_code?: string;
|
|
15
25
|
sku?: string;
|
|
16
26
|
}
|
|
@@ -4,6 +4,7 @@ exports.mapInvoicingProductPayloadToState = exports.mapInvoicingPlanTierPayloadT
|
|
|
4
4
|
const amount_1 = require("../../../commonStateTypes/amount");
|
|
5
5
|
const currencyHelper_1 = require("../../../commonStateTypes/currencyHelper");
|
|
6
6
|
const zeniDayJS_1 = require("../../../zeniDayJS");
|
|
7
|
+
const invoicingCommonPayload_1 = require("../invoicingCommonPayload");
|
|
7
8
|
// ── Payload → State mappers (snake_case wire shape → camelCase domain shape) ──
|
|
8
9
|
const mapInvoicingPlanTierPayloadToState = (payload, currencyCode, currencySymbol) => ({
|
|
9
10
|
price: (0, amount_1.toAmount)(payload.price, currencyCode, currencySymbol),
|
|
@@ -14,11 +15,22 @@ const mapInvoicingPlanTierPayloadToState = (payload, currencyCode, currencySymbo
|
|
|
14
15
|
});
|
|
15
16
|
exports.mapInvoicingPlanTierPayloadToState = mapInvoicingPlanTierPayloadToState;
|
|
16
17
|
const mapInvoicingAccountingDetailPayloadToState = (payload) => ({
|
|
17
|
-
|
|
18
|
+
// The QuickBooks id first in both, for the reason `firstSelectableInvoicingId`
|
|
19
|
+
// documents: the form's pickers are keyed on it, so reading the internal id
|
|
20
|
+
// would leave the field blank over a mapping that exists.
|
|
21
|
+
accountingCategory1: (0, invoicingCommonPayload_1.firstSelectableInvoicingId)([
|
|
22
|
+
payload.accounting_class?.qbo_id,
|
|
23
|
+
payload.accounting_class?.accounting_class_id,
|
|
24
|
+
payload.accounting_category_1,
|
|
25
|
+
]),
|
|
18
26
|
accountingCategory2: payload.accounting_category_2,
|
|
19
27
|
accountingCategory3: payload.accounting_category_3,
|
|
20
28
|
accountingCategory4: payload.accounting_category_4,
|
|
21
|
-
accountingCode:
|
|
29
|
+
accountingCode: (0, invoicingCommonPayload_1.firstSelectableInvoicingId)([
|
|
30
|
+
payload.account?.qbo_id,
|
|
31
|
+
payload.account?.account_id,
|
|
32
|
+
payload.accounting_code,
|
|
33
|
+
]),
|
|
22
34
|
sku: payload.sku,
|
|
23
35
|
});
|
|
24
36
|
const mapInvoicingProductPayloadToState = (payload) => {
|
package/lib/epic.d.ts
CHANGED
|
@@ -265,7 +265,7 @@ import { ActionType as InvoicingTransactionListViewActionType } from './view/inv
|
|
|
265
265
|
import { ActionType as InvoicingPaymentActionActionType } from './view/invoicing/paymentAction/paymentActionEpic';
|
|
266
266
|
import { ActionType as InvoicingPromotionalCreditActionActionType } from './view/invoicing/promotionalCreditAction/promotionalCreditActionEpic';
|
|
267
267
|
import { ActionType as RecordPaymentActionType } from './view/invoicing/recordPayment/recordPaymentEpic';
|
|
268
|
-
import {
|
|
268
|
+
import { InvoicingSettingsViewActionType } from './view/invoicing/settingsView/epics/settingsViewActionType';
|
|
269
269
|
import { ActionType as InvoicingSubscriptionActionActionType } from './view/invoicing/subscriptionAction/subscriptionActionEpic';
|
|
270
270
|
import { ActionType as FetchMonthClosePerformanceTrendActionType } from './view/monthEndCloseChecksView/epics/fetchMonthClosePerformanceTrendEpic';
|
|
271
271
|
import { ActionType as FetchMonthEndCloseChecksActionType } from './view/monthEndCloseChecksView/epics/fetchMonthEndCloseChecksEpic';
|
package/lib/epic.js
CHANGED
|
@@ -313,8 +313,12 @@ const issueCreditNoteEpic_1 = require("./view/invoicing/issueCreditNote/issueCre
|
|
|
313
313
|
const paymentActionEpic_1 = require("./view/invoicing/paymentAction/paymentActionEpic");
|
|
314
314
|
const promotionalCreditActionEpic_1 = require("./view/invoicing/promotionalCreditAction/promotionalCreditActionEpic");
|
|
315
315
|
const recordPaymentEpic_1 = require("./view/invoicing/recordPayment/recordPaymentEpic");
|
|
316
|
+
const connectInvoicingStripeEpic_1 = require("./view/invoicing/settingsView/epics/connectInvoicingStripeEpic");
|
|
317
|
+
const disconnectInvoicingStripeEpic_1 = require("./view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic");
|
|
318
|
+
const fetchInvoicingSettingsEpic_1 = require("./view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic");
|
|
319
|
+
const saveInvoicingSettingsEpic_1 = require("./view/invoicing/settingsView/epics/saveInvoicingSettingsEpic");
|
|
320
|
+
const submitInvoicingQboSettingsEpic_1 = require("./view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic");
|
|
316
321
|
const invoicingBrandingFormEpics_1 = require("./view/invoicing/settingsView/invoicingBrandingFormEpics");
|
|
317
|
-
const settingsViewEpics_1 = require("./view/invoicing/settingsView/settingsViewEpics");
|
|
318
322
|
const subscriptionActionEpic_1 = require("./view/invoicing/subscriptionAction/subscriptionActionEpic");
|
|
319
323
|
const fetchMonthClosePerformanceTrendEpic_1 = require("./view/monthEndCloseChecksView/epics/fetchMonthClosePerformanceTrendEpic");
|
|
320
324
|
const fetchMonthEndCloseChecksEpic_1 = require("./view/monthEndCloseChecksView/epics/fetchMonthEndCloseChecksEpic");
|
|
@@ -762,7 +766,7 @@ const ALL_EPICS = [
|
|
|
762
766
|
confirmBulkUploadMatchEpic_1.confirmBulkUploadMatchEpic,
|
|
763
767
|
confirmCardSetupIntentEpic_1.confirmCardSetupIntentEpic,
|
|
764
768
|
confirmStatementMappingEpic_1.confirmStatementMappingEpic,
|
|
765
|
-
|
|
769
|
+
connectInvoicingStripeEpic_1.connectInvoicingStripeEpic,
|
|
766
770
|
convertAmountToHomeCurrencyEpic_1.convertAmountToHomeCurrencyEpic,
|
|
767
771
|
createAddressEpic_1.createAddressEpic,
|
|
768
772
|
createAutoTransferRuleEpic_1.createAutoTransferRuleEpic,
|
|
@@ -814,7 +818,7 @@ const ALL_EPICS = [
|
|
|
814
818
|
deleteTransactionAttachmentEpic_1.deleteTransactionAttachmentEpic,
|
|
815
819
|
deleteUserBankAccountEpic_1.deleteUserBankAccountEpic,
|
|
816
820
|
disableAccountingProjectsEpic_1.disableAccountingProjectsEpic,
|
|
817
|
-
|
|
821
|
+
disconnectInvoicingStripeEpic_1.disconnectInvoicingStripeEpic,
|
|
818
822
|
dismissCapitalizationOnboardingEpic_1.dismissCapitalizationOnboardingEpic,
|
|
819
823
|
doMagicLinkSignInEpic_1.doMagicLinkSignInEpic,
|
|
820
824
|
signInUserEpic_1.doSignInEpic,
|
|
@@ -1023,7 +1027,7 @@ const ALL_EPICS = [
|
|
|
1023
1027
|
customerPaymentMethodEpic_1.fetchInvoicingPlaidLinkTokenEpic,
|
|
1024
1028
|
fetchInvoicingQboConnectionEpic_1.fetchInvoicingQboConnectionEpic,
|
|
1025
1029
|
fetchInvoicingQboSyncHealthEpic_1.fetchInvoicingQboSyncHealthEpic,
|
|
1026
|
-
|
|
1030
|
+
fetchInvoicingSettingsEpic_1.fetchInvoicingSettingsEpic,
|
|
1027
1031
|
fetchInvoicingSubscriptionCountsEpic_1.fetchInvoicingSubscriptionCountsEpic,
|
|
1028
1032
|
invoicingSubscriptionDetailViewEpics_1.fetchInvoicingSubscriptionDetailEpic,
|
|
1029
1033
|
fetchInvoicingSubscriptionFormPageEpic_1.fetchInvoicingSubscriptionFormPageEpic,
|
|
@@ -1311,7 +1315,7 @@ const ALL_EPICS = [
|
|
|
1311
1315
|
saveInvoicingCouponEpic_1.saveInvoicingCouponEpic,
|
|
1312
1316
|
saveInvoicingCustomerEpic_1.saveInvoicingCustomerEpic,
|
|
1313
1317
|
customerPaymentMethodEpic_1.saveInvoicingPaymentMethodEpic,
|
|
1314
|
-
|
|
1318
|
+
saveInvoicingSettingsEpic_1.saveInvoicingSettingsEpic,
|
|
1315
1319
|
saveInvoicingSubscriptionEpic_1.saveInvoicingSubscriptionEpic,
|
|
1316
1320
|
saveMagicLinkBankAccountEpic_1.saveMagicLinkBankAccountEpic,
|
|
1317
1321
|
saveNewAddressEpic_1.saveNewAddressEpic,
|
|
@@ -1360,6 +1364,7 @@ const ALL_EPICS = [
|
|
|
1360
1364
|
submitFeedbackEpic_1.submitFeedbackEpic,
|
|
1361
1365
|
submitIntlVerificationEpic_1.submitIntlVerificationEpic,
|
|
1362
1366
|
invoicingBrandingFormEpics_1.submitInvoicingBrandingFormEpic,
|
|
1367
|
+
submitInvoicingQboSettingsEpic_1.submitInvoicingQboSettingsEpic,
|
|
1363
1368
|
submitQuestionEpic_1.submitQuestionEpic,
|
|
1364
1369
|
syncInvoicingSubscriptionCouponsEpic_1.syncInvoicingSubscriptionCouponsEpic,
|
|
1365
1370
|
syncTabsAfterAutomatchEpic_1.syncTabsAfterAutomatchEpic,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toAccountPayload } from '../account/accountPayload';
|
|
1
2
|
export const INVOICING_DUNNING_ACTIONS = [
|
|
2
3
|
'email_only',
|
|
3
4
|
'email_and_retry',
|
|
@@ -129,87 +130,46 @@ export function toInvoicingQboCustomerMatchingMode(value) {
|
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
132
|
/**
|
|
132
|
-
* The id
|
|
133
|
-
*
|
|
134
|
-
*
|
|
133
|
+
* The first id a picker can actually select. Callers list the QuickBooks id
|
|
134
|
+
* first: the options are keyed on it, so a platform id selects nothing even when
|
|
135
|
+
* it names the same record. Blank counts as absent.
|
|
135
136
|
*/
|
|
136
|
-
|
|
137
|
-
// `qbo_id` first: the pickers key their options on the QuickBooks id, so an
|
|
138
|
-
// internal `account_id` would not select anything even when it is the same
|
|
139
|
-
// account. Both are read because the mapping arrives either way depending on
|
|
140
|
-
// how it was saved.
|
|
141
|
-
const candidates = [
|
|
142
|
-
mappedAccount?.qbo_id,
|
|
143
|
-
mappedAccount?.account_id,
|
|
144
|
-
legacyAccountId,
|
|
145
|
-
];
|
|
146
|
-
return candidates.find((candidate) => candidate != null && candidate !== '');
|
|
147
|
-
}
|
|
137
|
+
export const firstSelectableInvoicingId = (candidates) => candidates.find((candidate) => candidate != null && candidate !== '');
|
|
148
138
|
/**
|
|
149
|
-
*
|
|
150
|
-
* `
|
|
139
|
+
* The slot a mapping code names. Codes arrive from the config API as the slot
|
|
140
|
+
* itself (`deposit_account`); a trailing `_id` is tolerated so a tenant sending
|
|
141
|
+
* the older `deposit_account_id` resolves to the same mapping.
|
|
151
142
|
*/
|
|
143
|
+
export const toInvoicingQboAccountMappingSlot = (code) => code.replace(/_id$/, '');
|
|
144
|
+
/** Read one account-mapping dropdown value by its config `code`. */
|
|
152
145
|
export function getInvoicingQboAccountMappingId(accountMappings, code) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
return readInvoicingQboMappedAccountId(accountMappings?.discounts_account, accountMappings?.discounts_account_id);
|
|
160
|
-
case 'rounding_account_id':
|
|
161
|
-
return readInvoicingQboMappedAccountId(accountMappings?.rounding_account, accountMappings?.rounding_account_id);
|
|
162
|
-
case 'write_off_account_id':
|
|
163
|
-
return readInvoicingQboMappedAccountId(accountMappings?.write_off_account, accountMappings?.write_off_account_id);
|
|
164
|
-
default:
|
|
165
|
-
return undefined;
|
|
146
|
+
const slotKey = toInvoicingQboAccountMappingSlot(code);
|
|
147
|
+
// Either key: the service sends `deposit_account`, but an older payload put
|
|
148
|
+
// the id under `deposit_account_id`.
|
|
149
|
+
const slot = accountMappings?.[slotKey] ?? accountMappings?.[`${slotKey}_id`];
|
|
150
|
+
if (typeof slot === 'string') {
|
|
151
|
+
return slot !== '' ? slot : undefined;
|
|
166
152
|
}
|
|
153
|
+
return firstSelectableInvoicingId([slot?.qbo_id, slot?.account_id]);
|
|
167
154
|
}
|
|
168
155
|
/**
|
|
169
|
-
*
|
|
170
|
-
*
|
|
156
|
+
* Build the `account_mappings` request body from the ids the pickers submitted.
|
|
157
|
+
* Each kind is sent as the whole account, which is what the service stores; an
|
|
158
|
+
* id that resolves to no account is sent as it stands rather than dropped, so a
|
|
159
|
+
* save never silently unsets a mapping it could not expand.
|
|
171
160
|
*/
|
|
172
|
-
export
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
};
|
|
185
|
-
case 'default_income_account_id':
|
|
186
|
-
return {
|
|
187
|
-
...base,
|
|
188
|
-
default_income_account: undefined,
|
|
189
|
-
default_income_account_id: accountId,
|
|
190
|
-
};
|
|
191
|
-
case 'discounts_account_id':
|
|
192
|
-
return {
|
|
193
|
-
...base,
|
|
194
|
-
discounts_account: undefined,
|
|
195
|
-
discounts_account_id: accountId,
|
|
196
|
-
};
|
|
197
|
-
case 'rounding_account_id':
|
|
198
|
-
return {
|
|
199
|
-
...base,
|
|
200
|
-
rounding_account: undefined,
|
|
201
|
-
rounding_account_id: accountId,
|
|
202
|
-
};
|
|
203
|
-
case 'write_off_account_id':
|
|
204
|
-
return {
|
|
205
|
-
...base,
|
|
206
|
-
write_off_account: undefined,
|
|
207
|
-
write_off_account_id: accountId,
|
|
208
|
-
};
|
|
209
|
-
default:
|
|
210
|
-
return base;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
161
|
+
export const toInvoicingQboAccountMappingsPayload = (accountIdByMappingCode, accountForId) => {
|
|
162
|
+
const mappings = {};
|
|
163
|
+
Object.entries(accountIdByMappingCode).forEach(([code, accountId]) => {
|
|
164
|
+
if (accountId === '') {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const account = accountForId(accountId);
|
|
168
|
+
mappings[toInvoicingQboAccountMappingSlot(code)] =
|
|
169
|
+
account != null ? toAccountPayload(account) : accountId;
|
|
170
|
+
});
|
|
171
|
+
return mappings;
|
|
172
|
+
};
|
|
213
173
|
export function toInvoicingQboAccountMappingKindOption(option) {
|
|
214
174
|
return {
|
|
215
175
|
accountTypes: option.account_types,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { toAmount } from '../../../commonStateTypes/amount';
|
|
2
2
|
import { defaultCustomerCurrency } from '../../../commonStateTypes/currencyHelper';
|
|
3
3
|
import { date } from '../../../zeniDayJS';
|
|
4
|
+
import { firstSelectableInvoicingId } from '../invoicingCommonPayload';
|
|
4
5
|
// ── Payload → State mappers (snake_case wire shape → camelCase domain shape) ──
|
|
5
6
|
export const mapInvoicingPlanTierPayloadToState = (payload, currencyCode, currencySymbol) => ({
|
|
6
7
|
price: toAmount(payload.price, currencyCode, currencySymbol),
|
|
@@ -10,11 +11,22 @@ export const mapInvoicingPlanTierPayloadToState = (payload, currencyCode, curren
|
|
|
10
11
|
pricingType: payload.pricing_type,
|
|
11
12
|
});
|
|
12
13
|
const mapInvoicingAccountingDetailPayloadToState = (payload) => ({
|
|
13
|
-
|
|
14
|
+
// The QuickBooks id first in both, for the reason `firstSelectableInvoicingId`
|
|
15
|
+
// documents: the form's pickers are keyed on it, so reading the internal id
|
|
16
|
+
// would leave the field blank over a mapping that exists.
|
|
17
|
+
accountingCategory1: firstSelectableInvoicingId([
|
|
18
|
+
payload.accounting_class?.qbo_id,
|
|
19
|
+
payload.accounting_class?.accounting_class_id,
|
|
20
|
+
payload.accounting_category_1,
|
|
21
|
+
]),
|
|
14
22
|
accountingCategory2: payload.accounting_category_2,
|
|
15
23
|
accountingCategory3: payload.accounting_category_3,
|
|
16
24
|
accountingCategory4: payload.accounting_category_4,
|
|
17
|
-
accountingCode:
|
|
25
|
+
accountingCode: firstSelectableInvoicingId([
|
|
26
|
+
payload.account?.qbo_id,
|
|
27
|
+
payload.account?.account_id,
|
|
28
|
+
payload.accounting_code,
|
|
29
|
+
]),
|
|
18
30
|
sku: payload.sku,
|
|
19
31
|
});
|
|
20
32
|
export const mapInvoicingProductPayloadToState = (payload) => {
|
package/lib/esm/epic.js
CHANGED
|
@@ -310,8 +310,12 @@ import { issueCreditNoteEpic } from './view/invoicing/issueCreditNote/issueCredi
|
|
|
310
310
|
import { runInvoicingPaymentActionEpic, } from './view/invoicing/paymentAction/paymentActionEpic';
|
|
311
311
|
import { addPromotionalCreditsEpic, } from './view/invoicing/promotionalCreditAction/promotionalCreditActionEpic';
|
|
312
312
|
import { recordPaymentEpic, } from './view/invoicing/recordPayment/recordPaymentEpic';
|
|
313
|
+
import { connectInvoicingStripeEpic } from './view/invoicing/settingsView/epics/connectInvoicingStripeEpic';
|
|
314
|
+
import { disconnectInvoicingStripeEpic } from './view/invoicing/settingsView/epics/disconnectInvoicingStripeEpic';
|
|
315
|
+
import { fetchInvoicingSettingsEpic } from './view/invoicing/settingsView/epics/fetchInvoicingSettingsEpic';
|
|
316
|
+
import { saveInvoicingSettingsEpic } from './view/invoicing/settingsView/epics/saveInvoicingSettingsEpic';
|
|
317
|
+
import { submitInvoicingQboSettingsEpic } from './view/invoicing/settingsView/epics/submitInvoicingQboSettingsEpic';
|
|
313
318
|
import { initializeInvoicingBrandingAddressEpic, submitInvoicingBrandingFormEpic, } from './view/invoicing/settingsView/invoicingBrandingFormEpics';
|
|
314
|
-
import { connectInvoicingStripeEpic, disconnectInvoicingStripeEpic, fetchInvoicingSettingsEpic, saveInvoicingSettingsEpic, } from './view/invoicing/settingsView/settingsViewEpics';
|
|
315
319
|
import { runInvoicingSubscriptionActionEpic, } from './view/invoicing/subscriptionAction/subscriptionActionEpic';
|
|
316
320
|
import { fetchMonthClosePerformanceTrendEpic, } from './view/monthEndCloseChecksView/epics/fetchMonthClosePerformanceTrendEpic';
|
|
317
321
|
import { fetchMonthEndCloseChecksEpic, } from './view/monthEndCloseChecksView/epics/fetchMonthEndCloseChecksEpic';
|
|
@@ -1357,6 +1361,7 @@ const ALL_EPICS = [
|
|
|
1357
1361
|
submitFeedbackEpic,
|
|
1358
1362
|
submitIntlVerificationEpic,
|
|
1359
1363
|
submitInvoicingBrandingFormEpic,
|
|
1364
|
+
submitInvoicingQboSettingsEpic,
|
|
1360
1365
|
submitQuestionEpic,
|
|
1361
1366
|
syncInvoicingSubscriptionCouponsEpic,
|
|
1362
1367
|
syncTabsAfterAutomatchEpic,
|
package/lib/esm/index.js
CHANGED
|
@@ -194,11 +194,11 @@ import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement, }
|
|
|
194
194
|
import { applyTransactionFilters } from './view/expenseAutomationView/transactionFilterHelpers';
|
|
195
195
|
import { TRANSACTION_FILTER_CATEGORIES, } from './view/expenseAutomationView/transactionFilterTypes';
|
|
196
196
|
import { DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab, } from './view/expenseAutomationView/types/completedSubTab';
|
|
197
|
-
import { DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, toTransactionGroup, } from './view/expenseAutomationView/types/transactionGroup';
|
|
198
197
|
import { toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey, } from './view/expenseAutomationView/types/jeSchedulesViewState';
|
|
199
198
|
import { BATCH_FILE_STATUSES, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toMatchSource, toMissingReceiptsTab, } from './view/expenseAutomationView/types/missingReceiptsViewState';
|
|
200
199
|
import { toMissingReceiptsSortKey as toExpenseAutomationMissingReceiptsSortKey, } from './view/expenseAutomationView/types/missingReceiptsViewState';
|
|
201
200
|
import { toReconciliationTabsType, } from './view/expenseAutomationView/types/reconciliationViewState';
|
|
201
|
+
import { DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, toTransactionGroup, } from './view/expenseAutomationView/types/transactionGroup';
|
|
202
202
|
import { toTransactionsTabKey as toExpenseAutomationTransactionsTabKey, toTransactionsSortKey, } from './view/expenseAutomationView/types/transactionsViewState';
|
|
203
203
|
import { fetchRegisteredInterests, notifyMeForFeature, } from './view/featureNotificationView/featureNotificationViewReducer';
|
|
204
204
|
import { getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered, } from './view/featureNotificationView/featureNotificationViewSelector';
|
|
@@ -849,15 +849,16 @@ export { getInvoicingCatalogItemDetail } from './view/invoicing/invoicingCatalog
|
|
|
849
849
|
export { getInvoicingPlanById } from './entity/invoicing/plan/planSelector';
|
|
850
850
|
export { getInvoicingProductById } from './entity/invoicing/product/productSelector';
|
|
851
851
|
// ── Invoicing: settings ───────────────────────────────────────────────────────
|
|
852
|
-
export { connectInvoicingStripe, disconnectInvoicingStripe, fetchInvoicingSettings, resetInvoicingBrandingFormDraft, resetSaveInvoicingSettings, saveInvoicingSettings, submitInvoicingBrandingForm, updateInvoicingBrandingFormDraft, updateInvoicingSettings, } from './view/invoicing/settingsView/settingsViewReducer';
|
|
853
|
-
export { getInvoicingBrandingFormView, getInvoicingSettings, getInvoicingSettingsFetchState, getInvoicingSettingsHubView, getInvoicingSettingsView, } from './view/invoicing/settingsView/settingsViewSelector';
|
|
852
|
+
export { connectInvoicingStripe, disconnectInvoicingStripe, fetchInvoicingSettings, resetInvoicingBrandingFormDraft, resetInvoicingQboSettingsDraft, resetSaveInvoicingSettings, saveInvoicingSettings, submitInvoicingBrandingForm, submitInvoicingQboSettings, updateInvoicingBrandingFormDraft, updateInvoicingQboSettingsDraft, updateInvoicingSettings, } from './view/invoicing/settingsView/settingsViewReducer';
|
|
853
|
+
export { getInvoicingBrandingFormView, getInvoicingQboSettingsFormView, getInvoicingSettings, getInvoicingSettingsFetchState, getInvoicingSettingsHubView, getInvoicingSettingsView, } from './view/invoicing/settingsView/settingsViewSelector';
|
|
854
|
+
export { entityToInvoicingQboSettingsLocalData, initialInvoicingQboSettingsLocalData, invoicingQboSettingsLocalDataToPayload, } from './view/invoicing/settingsView/invoicingQboSettingsFormConfig';
|
|
854
855
|
export { INVOICING_BUSINESS_ADDRESS_TYPE, entityToInvoicingBrandingFormLocalData, initialInvoicingBrandingFormLocalData, } from './view/invoicing/settingsView/invoicingBrandingFormConfig';
|
|
855
856
|
export { isStripeConnectedFromSettings } from './view/invoicing/settingsView/invoicingSettingsHelpers';
|
|
856
857
|
// ── Invoicing: QBO integration ────────────────────────────────────────────────
|
|
857
858
|
export { fetchInvoicingAccountingPickers, fetchInvoicingQboConnection, fetchInvoicingQboSyncHealth, retryInvoicingQboSyncTask, startInvoicingQboBackfill, } from './view/invoicing/invoicingQboView/invoicingQboViewReducer';
|
|
858
859
|
export { INVOICING_INCOME_ACCOUNT_TYPES, invoicingAccountsForQboAccountTypes, } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
|
|
859
860
|
export { getInvoicingQboView } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
|
|
860
|
-
export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingNamedOptionsByKey, toInvoicingQboCustomerMatchingMode,
|
|
861
|
+
export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingNamedOptionsByKey, toInvoicingQboCustomerMatchingMode, } from './entity/invoicing/invoicingCommonPayload';
|
|
861
862
|
// ── Invoicing: config ─────────────────────────────────────────────────────────
|
|
862
863
|
export { acceptInvoicingTerms, enableInvoicing, fetchInvoicingConfig, resetInvoicingConfigActionStates, updateInvoicingConfig, } from './view/invoicing/invoicingConfigView/invoicingConfigViewReducer';
|
|
863
864
|
export { getInvoicingConfigView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
|