@zeniai/client-epic-state 5.1.77 → 5.1.78

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.
Files changed (95) hide show
  1. package/lib/entity/invoicing/invoicingCommonPayload.d.ts +42 -0
  2. package/lib/entity/invoicing/invoicingCommonPayload.js +66 -1
  3. package/lib/entity/tenant/clearAllEpic.d.ts +2 -1
  4. package/lib/entity/tenant/clearAllEpic.js +2 -0
  5. package/lib/epic.d.ts +2 -1
  6. package/lib/epic.js +7 -1
  7. package/lib/esm/entity/invoicing/invoicingCommonPayload.js +61 -0
  8. package/lib/esm/entity/tenant/clearAllEpic.js +2 -0
  9. package/lib/esm/epic.js +7 -1
  10. package/lib/esm/index.js +5 -1
  11. package/lib/esm/reducer.js +3 -0
  12. package/lib/esm/view/invoicing/createCreditNote/createCreditNoteFormConfig.js +6 -1
  13. package/lib/esm/view/invoicing/createCreditNote/createCreditNotePayload.js +1 -8
  14. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.js +4 -5
  15. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +10 -11
  16. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.js +8 -10
  17. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewPayload.js +2 -2
  18. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewReducer.js +1 -1
  19. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector.js +1 -1
  20. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewState.js +43 -1
  21. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.js +2 -5
  22. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig.js +1 -2
  23. package/lib/esm/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +7 -1
  24. package/lib/esm/view/invoicing/invoicingConfigView/invoicingConfigViewSelector.js +3 -0
  25. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.js +25 -0
  26. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.js +15 -0
  27. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboConnectionEpic.js +15 -0
  28. package/lib/esm/view/invoicing/invoicingQboView/epics/fetchInvoicingQboSyncHealthEpic.js +15 -0
  29. package/lib/esm/view/invoicing/invoicingQboView/epics/invoicingQboViewActionType.js +1 -0
  30. package/lib/esm/view/invoicing/invoicingQboView/epics/retryInvoicingQboSyncTaskEpic.js +26 -0
  31. package/lib/esm/view/invoicing/invoicingQboView/epics/startInvoicingQboBackfillEpic.js +18 -0
  32. package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewPayload.js +47 -0
  33. package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewReducer.js +128 -0
  34. package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +20 -0
  35. package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewState.js +1 -0
  36. package/lib/esm/view/invoicing/issueCreditNote/issueCreditNotePayload.js +4 -11
  37. package/lib/esm/view/invoicing/recordPayment/recordPaymentFormConfig.js +0 -1
  38. package/lib/esm/view/invoicing/recordPayment/recordPaymentPayload.js +5 -14
  39. package/lib/index.d.ts +7 -1
  40. package/lib/index.js +20 -4
  41. package/lib/reducer.d.ts +3 -0
  42. package/lib/reducer.js +3 -0
  43. package/lib/view/invoicing/createCreditNote/createCreditNoteFormConfig.js +6 -1
  44. package/lib/view/invoicing/createCreditNote/createCreditNotePayload.js +1 -8
  45. package/lib/view/invoicing/createCreditNote/createCreditNoteState.d.ts +3 -1
  46. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.d.ts +2 -1
  47. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.js +4 -5
  48. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +10 -11
  49. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewState.d.ts +10 -5
  50. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.js +8 -10
  51. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewPayload.js +2 -2
  52. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewReducer.js +3 -3
  53. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector.js +2 -2
  54. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewState.d.ts +9 -2
  55. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewState.js +45 -0
  56. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.js +2 -5
  57. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewState.d.ts +3 -1
  58. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig.js +1 -2
  59. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewPayload.d.ts +4 -1
  60. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.d.ts +1 -1
  61. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +6 -0
  62. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewSelector.d.ts +4 -1
  63. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewSelector.js +3 -0
  64. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewState.d.ts +4 -1
  65. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.d.ts +6 -0
  66. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboAccountsEpic.js +29 -0
  67. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.d.ts +6 -0
  68. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboClassesEpic.js +19 -0
  69. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboConnectionEpic.d.ts +6 -0
  70. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboConnectionEpic.js +19 -0
  71. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboSyncHealthEpic.d.ts +6 -0
  72. package/lib/view/invoicing/invoicingQboView/epics/fetchInvoicingQboSyncHealthEpic.js +19 -0
  73. package/lib/view/invoicing/invoicingQboView/epics/invoicingQboViewActionType.d.ts +2 -0
  74. package/lib/view/invoicing/invoicingQboView/epics/invoicingQboViewActionType.js +2 -0
  75. package/lib/view/invoicing/invoicingQboView/epics/retryInvoicingQboSyncTaskEpic.d.ts +6 -0
  76. package/lib/view/invoicing/invoicingQboView/epics/retryInvoicingQboSyncTaskEpic.js +30 -0
  77. package/lib/view/invoicing/invoicingQboView/epics/startInvoicingQboBackfillEpic.d.ts +6 -0
  78. package/lib/view/invoicing/invoicingQboView/epics/startInvoicingQboBackfillEpic.js +22 -0
  79. package/lib/view/invoicing/invoicingQboView/invoicingQboViewPayload.d.ts +79 -0
  80. package/lib/view/invoicing/invoicingQboView/invoicingQboViewPayload.js +52 -0
  81. package/lib/view/invoicing/invoicingQboView/invoicingQboViewReducer.d.ts +25 -0
  82. package/lib/view/invoicing/invoicingQboView/invoicingQboViewReducer.js +132 -0
  83. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.d.ts +21 -0
  84. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +24 -0
  85. package/lib/view/invoicing/invoicingQboView/invoicingQboViewState.d.ts +14 -0
  86. package/lib/view/invoicing/invoicingQboView/invoicingQboViewState.js +2 -0
  87. package/lib/view/invoicing/issueCreditNote/issueCreditNotePayload.js +4 -11
  88. package/lib/view/invoicing/issueCreditNote/issueCreditNoteState.d.ts +3 -2
  89. package/lib/view/invoicing/recordPayment/recordPaymentFormConfig.js +0 -1
  90. package/lib/view/invoicing/recordPayment/recordPaymentPayload.js +5 -14
  91. package/lib/view/invoicing/recordPayment/recordPaymentState.d.ts +4 -2
  92. package/package.json +1 -1
  93. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/invoicingCouponFormConfig.js +0 -44
  94. package/lib/view/invoicing/editInvoicingCouponDetailView/invoicingCouponFormConfig.d.ts +0 -5
  95. package/lib/view/invoicing/editInvoicingCouponDetailView/invoicingCouponFormConfig.js +0 -48
@@ -0,0 +1,25 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, map, mergeMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { mapInvoicingQboAccountOptions, } from '../invoicingQboViewPayload';
5
+ import { fetchInvoicingQboAccounts, updateInvoicingQboAccounts, updateInvoicingQboAccountsFailure, } from '../invoicingQboViewReducer';
6
+ export const fetchInvoicingQboAccountsEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchInvoicingQboAccounts.match), mergeMap((action) => {
7
+ const { accountTypes } = action.payload;
8
+ const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/qbo/accounts?account_types=${encodeURIComponent(accountTypes)}`;
9
+ return zeniAPI.getJSON(apiUrl).pipe(map((response) => {
10
+ if (isSuccessResponse(response)) {
11
+ return updateInvoicingQboAccounts({
12
+ accountTypes,
13
+ accounts: mapInvoicingQboAccountOptions(response.data?.accounts ?? []),
14
+ });
15
+ }
16
+ return updateInvoicingQboAccountsFailure({
17
+ accountTypes,
18
+ status: response.status,
19
+ });
20
+ }), catchError((error) => of(updateInvoicingQboAccountsFailure({
21
+ accountTypes,
22
+ status: createZeniAPIStatus('Unexpected Error', 'Fetch QBO accounts REST API call errored out ' +
23
+ JSON.stringify(error)),
24
+ }))));
25
+ }));
@@ -0,0 +1,15 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, map, switchMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { mapInvoicingQboAccountOptions, } from '../invoicingQboViewPayload';
5
+ import { fetchInvoicingQboClasses, updateInvoicingQboClasses, updateInvoicingQboClassesFailure, } from '../invoicingQboViewReducer';
6
+ export const fetchInvoicingQboClassesEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchInvoicingQboClasses.match), switchMap(() => {
7
+ const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/qbo/classes`;
8
+ return zeniAPI.getJSON(apiUrl).pipe(map((response) => {
9
+ if (isSuccessResponse(response)) {
10
+ return updateInvoicingQboClasses(mapInvoicingQboAccountOptions(response.data?.accounts ?? []));
11
+ }
12
+ return updateInvoicingQboClassesFailure(response.status);
13
+ }), catchError((error) => of(updateInvoicingQboClassesFailure(createZeniAPIStatus('Unexpected Error', 'Fetch QBO classes REST API call errored out ' +
14
+ JSON.stringify(error))))));
15
+ }));
@@ -0,0 +1,15 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, map, switchMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { mapInvoicingQboConnection, } from '../invoicingQboViewPayload';
5
+ import { fetchInvoicingQboConnection, updateInvoicingQboConnection, updateInvoicingQboConnectionFailure, } from '../invoicingQboViewReducer';
6
+ export const fetchInvoicingQboConnectionEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchInvoicingQboConnection.match), switchMap(() => {
7
+ const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/qbo/connection`;
8
+ return zeniAPI.getJSON(apiUrl).pipe(map((response) => {
9
+ if (isSuccessResponse(response)) {
10
+ return updateInvoicingQboConnection(mapInvoicingQboConnection(response.data ?? { connected: false }));
11
+ }
12
+ return updateInvoicingQboConnectionFailure(response.status);
13
+ }), catchError((error) => of(updateInvoicingQboConnectionFailure(createZeniAPIStatus('Unexpected Error', 'Fetch QBO connection REST API call errored out ' +
14
+ JSON.stringify(error))))));
15
+ }));
@@ -0,0 +1,15 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, map, switchMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { mapInvoicingQboSyncHealth, } from '../invoicingQboViewPayload';
5
+ import { fetchInvoicingQboSyncHealth, updateInvoicingQboSyncHealth, updateInvoicingQboSyncHealthFailure, } from '../invoicingQboViewReducer';
6
+ export const fetchInvoicingQboSyncHealthEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchInvoicingQboSyncHealth.match), switchMap(() => {
7
+ const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/qbo/sync-health`;
8
+ return zeniAPI.getJSON(apiUrl).pipe(map((response) => {
9
+ if (isSuccessResponse(response)) {
10
+ return updateInvoicingQboSyncHealth(mapInvoicingQboSyncHealth(response.data ?? {}));
11
+ }
12
+ return updateInvoicingQboSyncHealthFailure(response.status);
13
+ }), catchError((error) => of(updateInvoicingQboSyncHealthFailure(createZeniAPIStatus('Unexpected Error', 'Fetch QBO sync health REST API call errored out ' +
14
+ JSON.stringify(error))))));
15
+ }));
@@ -0,0 +1,26 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { fetchInvoicingQboSyncHealth, retryInvoicingQboSyncTask, retryInvoicingQboSyncTaskFailure, retryInvoicingQboSyncTaskSuccess, } from '../invoicingQboViewReducer';
5
+ export const retryInvoicingQboSyncTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(retryInvoicingQboSyncTask.match), mergeMap((action) => {
6
+ const { taskId } = action.payload;
7
+ const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/qbo/sync-tasks/${encodeURIComponent(taskId)}/retry`;
8
+ return zeniAPI
9
+ .postAndGetJSON(apiUrl, {})
10
+ .pipe(mergeMap((response) => {
11
+ if (isSuccessResponse(response)) {
12
+ return of(retryInvoicingQboSyncTaskSuccess({
13
+ status: response.data?.status ?? '',
14
+ taskId: response.data?.task_id ?? taskId,
15
+ }), fetchInvoicingQboSyncHealth());
16
+ }
17
+ return of(retryInvoicingQboSyncTaskFailure({
18
+ status: response.status,
19
+ taskId,
20
+ }));
21
+ }), catchError((error) => of(retryInvoicingQboSyncTaskFailure({
22
+ status: createZeniAPIStatus('Unexpected Error', 'Retry QBO sync task REST API call errored out ' +
23
+ JSON.stringify(error)),
24
+ taskId,
25
+ }))));
26
+ }));
@@ -0,0 +1,18 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { fetchInvoicingQboSyncHealth, startInvoicingQboBackfill, startInvoicingQboBackfillFailure, startInvoicingQboBackfillSuccess, } from '../invoicingQboViewReducer';
5
+ export const startInvoicingQboBackfillEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(startInvoicingQboBackfill.match), switchMap((action) => {
6
+ const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/qbo/backfill`;
7
+ return zeniAPI
8
+ .postAndGetJSON(apiUrl, {
9
+ start_date: action.payload.startDate,
10
+ })
11
+ .pipe(mergeMap((response) => {
12
+ if (isSuccessResponse(response)) {
13
+ return of(startInvoicingQboBackfillSuccess(), fetchInvoicingQboSyncHealth());
14
+ }
15
+ return of(startInvoicingQboBackfillFailure(response.status));
16
+ }), catchError((error) => of(startInvoicingQboBackfillFailure(createZeniAPIStatus('Unexpected Error', 'Start QBO backfill REST API call errored out ' +
17
+ JSON.stringify(error))))));
18
+ }));
@@ -0,0 +1,47 @@
1
+ export function mapInvoicingQboConnection(payload) {
2
+ return {
3
+ connected: payload.connected,
4
+ companyName: payload.company_name ?? undefined,
5
+ connectionId: payload.connection_id ?? undefined,
6
+ realmId: payload.realm_id ?? undefined,
7
+ };
8
+ }
9
+ export function mapInvoicingQboAccountOptions(rows) {
10
+ return rows.flatMap((row) => {
11
+ // Only qbo_id is a valid QBO AccountRef/ClassRef value — platform-internal
12
+ // ids (account_id / id) are display metadata and must never be submitted.
13
+ const accountId = row.qbo_id ?? row.id ?? row.account_id ?? '';
14
+ if (accountId === '') {
15
+ return [];
16
+ }
17
+ const accountName = row.name ??
18
+ row.account_name ??
19
+ row.accounting_class_name ??
20
+ row.qbo_accounting_class_name ??
21
+ row.fully_qualified_name ??
22
+ accountId;
23
+ return [
24
+ {
25
+ id: accountId,
26
+ name: accountName,
27
+ accountType: row.account_type ?? undefined,
28
+ },
29
+ ];
30
+ });
31
+ }
32
+ export function mapInvoicingQboSyncHealth(payload) {
33
+ return {
34
+ connection: payload.connection != null
35
+ ? mapInvoicingQboConnection(payload.connection)
36
+ : undefined,
37
+ countsByStatus: payload.counts_by_status ?? {},
38
+ failedTasks: (payload.failed_tasks ?? []).map((task) => ({
39
+ attempts: task.attempts,
40
+ entityId: task.entity_id,
41
+ entityType: task.entity_type,
42
+ taskId: task.task_id,
43
+ lastError: task.last_error ?? undefined,
44
+ updatedAt: task.updated_at ?? undefined,
45
+ })),
46
+ };
47
+ }
@@ -0,0 +1,128 @@
1
+ import { createSlice } from '@reduxjs/toolkit';
2
+ export const initialState = {
3
+ accountsByAccountTypes: {},
4
+ accountsFetchStateByAccountTypes: {},
5
+ backfillFetchState: { fetchState: 'Not-Started', error: undefined },
6
+ classes: [],
7
+ classesFetchState: { fetchState: 'Not-Started', error: undefined },
8
+ connection: undefined,
9
+ connectionFetchState: { fetchState: 'Not-Started', error: undefined },
10
+ retryFetchStateByTaskId: {},
11
+ syncHealth: undefined,
12
+ syncHealthFetchState: { fetchState: 'Not-Started', error: undefined },
13
+ };
14
+ const invoicingQboView = createSlice({
15
+ name: 'invoicingQboView',
16
+ initialState,
17
+ reducers: {
18
+ fetchInvoicingQboConnection(draft) {
19
+ draft.connectionFetchState = {
20
+ fetchState: 'In-Progress',
21
+ error: undefined,
22
+ };
23
+ },
24
+ updateInvoicingQboConnection(draft, action) {
25
+ draft.connection = action.payload;
26
+ draft.connectionFetchState = { fetchState: 'Completed', error: undefined };
27
+ },
28
+ updateInvoicingQboConnectionFailure(draft, action) {
29
+ draft.connectionFetchState = { fetchState: 'Error', error: action.payload };
30
+ },
31
+ fetchInvoicingQboAccounts: {
32
+ reducer(draft, action) {
33
+ draft.accountsFetchStateByAccountTypes[action.payload.accountTypes] = {
34
+ fetchState: 'In-Progress',
35
+ error: undefined,
36
+ };
37
+ },
38
+ prepare(accountTypes) {
39
+ return { payload: { accountTypes } };
40
+ },
41
+ },
42
+ updateInvoicingQboAccounts(draft, action) {
43
+ draft.accountsByAccountTypes[action.payload.accountTypes] =
44
+ action.payload.accounts;
45
+ draft.accountsFetchStateByAccountTypes[action.payload.accountTypes] = {
46
+ fetchState: 'Completed',
47
+ error: undefined,
48
+ };
49
+ },
50
+ updateInvoicingQboAccountsFailure(draft, action) {
51
+ draft.accountsFetchStateByAccountTypes[action.payload.accountTypes] = {
52
+ fetchState: 'Error',
53
+ error: action.payload.status,
54
+ };
55
+ },
56
+ fetchInvoicingQboClasses(draft) {
57
+ draft.classesFetchState = { fetchState: 'In-Progress', error: undefined };
58
+ },
59
+ updateInvoicingQboClasses(draft, action) {
60
+ draft.classes = action.payload;
61
+ draft.classesFetchState = { fetchState: 'Completed', error: undefined };
62
+ },
63
+ updateInvoicingQboClassesFailure(draft, action) {
64
+ draft.classesFetchState = { fetchState: 'Error', error: action.payload };
65
+ },
66
+ fetchInvoicingQboSyncHealth(draft) {
67
+ draft.syncHealthFetchState = {
68
+ fetchState: 'In-Progress',
69
+ error: undefined,
70
+ };
71
+ },
72
+ updateInvoicingQboSyncHealth(draft, action) {
73
+ draft.syncHealth = action.payload;
74
+ draft.syncHealthFetchState = { fetchState: 'Completed', error: undefined };
75
+ },
76
+ updateInvoicingQboSyncHealthFailure(draft, action) {
77
+ draft.syncHealthFetchState = {
78
+ fetchState: 'Error',
79
+ error: action.payload,
80
+ };
81
+ },
82
+ retryInvoicingQboSyncTask: {
83
+ reducer(draft, action) {
84
+ draft.retryFetchStateByTaskId[action.payload.taskId] = {
85
+ fetchState: 'In-Progress',
86
+ error: undefined,
87
+ };
88
+ },
89
+ prepare(taskId) {
90
+ return { payload: { taskId } };
91
+ },
92
+ },
93
+ retryInvoicingQboSyncTaskSuccess(draft, action) {
94
+ draft.retryFetchStateByTaskId[action.payload.taskId] = {
95
+ fetchState: 'Completed',
96
+ error: undefined,
97
+ };
98
+ },
99
+ retryInvoicingQboSyncTaskFailure(draft, action) {
100
+ draft.retryFetchStateByTaskId[action.payload.taskId] = {
101
+ fetchState: 'Error',
102
+ error: action.payload.status,
103
+ };
104
+ },
105
+ startInvoicingQboBackfill: {
106
+ reducer(draft) {
107
+ draft.backfillFetchState = {
108
+ fetchState: 'In-Progress',
109
+ error: undefined,
110
+ };
111
+ },
112
+ prepare(startDate) {
113
+ return { payload: { startDate } };
114
+ },
115
+ },
116
+ startInvoicingQboBackfillSuccess(draft) {
117
+ draft.backfillFetchState = { fetchState: 'Completed', error: undefined };
118
+ },
119
+ startInvoicingQboBackfillFailure(draft, action) {
120
+ draft.backfillFetchState = { fetchState: 'Error', error: action.payload };
121
+ },
122
+ clearInvoicingQboView(draft) {
123
+ Object.assign(draft, initialState);
124
+ },
125
+ },
126
+ });
127
+ export const { fetchInvoicingQboConnection, updateInvoicingQboConnection, updateInvoicingQboConnectionFailure, fetchInvoicingQboAccounts, updateInvoicingQboAccounts, updateInvoicingQboAccountsFailure, fetchInvoicingQboClasses, updateInvoicingQboClasses, updateInvoicingQboClassesFailure, fetchInvoicingQboSyncHealth, updateInvoicingQboSyncHealth, updateInvoicingQboSyncHealthFailure, retryInvoicingQboSyncTask, retryInvoicingQboSyncTaskSuccess, retryInvoicingQboSyncTaskFailure, startInvoicingQboBackfill, startInvoicingQboBackfillSuccess, startInvoicingQboBackfillFailure, clearInvoicingQboView, } = invoicingQboView.actions;
128
+ export default invoicingQboView.reducer;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Single bundled view for the QBO integration settings screen — the
3
+ * connection, per-account-types account options, classes, sync health, and the
4
+ * fetch/action states for each of them.
5
+ */
6
+ export const getInvoicingQboView = (state) => {
7
+ const qboState = state.invoicingQboViewState;
8
+ return {
9
+ accountsByAccountTypes: qboState.accountsByAccountTypes,
10
+ accountsFetchStateByAccountTypes: qboState.accountsFetchStateByAccountTypes,
11
+ backfillState: qboState.backfillFetchState,
12
+ classes: qboState.classes,
13
+ classesFetchState: qboState.classesFetchState,
14
+ connection: qboState.connection,
15
+ connectionFetchState: qboState.connectionFetchState,
16
+ retryFetchStateByTaskId: qboState.retryFetchStateByTaskId,
17
+ syncHealth: qboState.syncHealth,
18
+ syncHealthFetchState: qboState.syncHealthFetchState,
19
+ };
20
+ };
@@ -1,15 +1,8 @@
1
- const dollarsFromAmountString = (value) => {
2
- const parsed = Number.parseFloat(value);
3
- if (Number.isNaN(parsed)) {
4
- return 0;
5
- }
6
- return parsed;
7
- };
8
1
  export const computeIssueCreditNoteTotal = (lineItems) => lineItems
9
2
  .filter((lineItem) => lineItem.selected)
10
3
  .reduce((total, lineItem) => {
11
4
  const quantity = Number.parseFloat(lineItem.quantity);
12
- const unitAmount = dollarsFromAmountString(lineItem.unitAmount);
5
+ const unitAmount = lineItem.unitAmount.amount;
13
6
  if (Number.isNaN(quantity) || quantity <= 0 || unitAmount <= 0) {
14
7
  return total;
15
8
  }
@@ -20,7 +13,7 @@ export const localDataToIssueCreditNotePayload = (localData) => {
20
13
  .filter((lineItem) => lineItem.selected)
21
14
  .map((lineItem) => {
22
15
  const quantity = Math.round(Number.parseFloat(lineItem.quantity));
23
- const unitAmount = dollarsFromAmountString(lineItem.unitAmount);
16
+ const unitAmount = lineItem.unitAmount.amount;
24
17
  return {
25
18
  description: lineItem.description,
26
19
  quantity,
@@ -43,9 +36,9 @@ export const initializeIssueCreditNoteDraftFromInvoice = (invoice) => ({
43
36
  description: lineItem.description,
44
37
  id: lineItem.id,
45
38
  maxQuantity: lineItem.quantity,
46
- maxUnitAmount: lineItem.unitAmount.amount,
39
+ maxUnitAmount: lineItem.unitAmount,
47
40
  quantity: String(lineItem.quantity),
48
41
  selected: true,
49
- unitAmount: lineItem.unitAmount.amount.toFixed(2),
42
+ unitAmount: lineItem.unitAmount,
50
43
  })),
51
44
  });
@@ -25,7 +25,6 @@ export const INVOICING_PAYMENT_GATEWAY_VALUES = [
25
25
  'other',
26
26
  ];
27
27
  export const initialRecordPaymentFormLocalData = {
28
- amount: '',
29
28
  comment: '',
30
29
  customerId: '',
31
30
  date: '',
@@ -1,17 +1,8 @@
1
+ import { toAmount } from '../../../commonStateTypes/amount';
1
2
  import { dateNow } from '../../../zeniDayJS';
2
3
  import { initialRecordPaymentFormLocalData } from './recordPaymentFormConfig';
3
4
  const trimOrUndefined = (value) => value.trim() !== '' ? value.trim() : undefined;
4
- const dollarsFromAmountString = (value) => {
5
- const parsed = Number.parseFloat(value);
6
- if (Number.isNaN(parsed)) {
7
- return 0;
8
- }
9
- return parsed;
10
- };
11
- const amountDueDollarsFromInvoice = (invoice) => {
12
- const amountDue = invoice.amountDue?.amount ?? 0;
13
- return amountDue.toFixed(2);
14
- };
5
+ const amountDueFromInvoice = (invoice) => invoice.amountDue ?? toAmount(0, 'USD', '$');
15
6
  /**
16
7
  * Build the invoice-scoped Record Payment body from the form draft. Amount stays
17
8
  * in dollars for the invoice endpoint.
@@ -21,7 +12,7 @@ export const localDataToInvoiceRecordPaymentBody = (localData) => {
21
12
  const date = localData.date.trim();
22
13
  const referenceNumber = trimOrUndefined(localData.referenceNumber);
23
14
  return {
24
- amount: dollarsFromAmountString(localData.amount),
15
+ amount: localData.amount?.amount ?? 0,
25
16
  payment_method: localData.paymentMethod,
26
17
  ...(gateway != null ? { gateway } : {}),
27
18
  ...(date !== '' ? { date } : {}),
@@ -34,7 +25,7 @@ export const localDataToInvoiceRecordPaymentBody = (localData) => {
34
25
  * and the linked invoice into `linked_invoices`. Currency is locked to USD.
35
26
  */
36
27
  export const localDataToRecordPaymentPayload = (localData) => {
37
- const amount = dollarsFromAmountString(localData.amount);
28
+ const amount = localData.amount?.amount ?? 0;
38
29
  const gateway = trimOrUndefined(localData.gateway);
39
30
  const date = localData.date.trim();
40
31
  const transactionId = trimOrUndefined(localData.transactionId);
@@ -60,7 +51,7 @@ export const localDataToRecordPaymentPayload = (localData) => {
60
51
  };
61
52
  export const initializeRecordPaymentDraftFromInvoice = (invoice) => ({
62
53
  ...initialRecordPaymentFormLocalData,
63
- amount: amountDueDollarsFromInvoice(invoice),
54
+ amount: amountDueFromInvoice(invoice),
64
55
  customerId: invoice.customerID,
65
56
  date: dateNow().format('YYYY-MM-DD'),
66
57
  invoiceToLink: invoice.id,
package/lib/index.d.ts CHANGED
@@ -1080,7 +1080,7 @@ export type { ApplicableCatalogItemOption, InvoicingCatalogItemFormView, } from
1080
1080
  export { resetEditInvoicingCouponDetailView, saveInvoicingCoupon, submitInvoicingCouponForm, updateInvoicingCouponFormDraft, } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewReducer';
1081
1081
  export type { SaveInvoicingCouponPayload, SubmitInvoicingCouponFormPayload, UpdateInvoicingCouponFormDraftPayload, } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewReducer';
1082
1082
  export type { InvoicingCouponFormLocalData } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewState';
1083
- export { entityToInvoicingCouponFormLocalData, initialInvoicingCouponFormLocalData, } from './view/invoicing/editInvoicingCouponDetailView/invoicingCouponFormConfig';
1083
+ export { entityToInvoicingCouponFormLocalData, initialInvoicingCouponFormLocalData, } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewState';
1084
1084
  export { getEditInvoicingCouponDetailViewState, getInvoicingCouponFormView, } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector';
1085
1085
  export type { EditInvoicingCouponDetailView, InvoicingCouponFormView, } from './view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector';
1086
1086
  export { clearInvoicingInvoiceAction, runInvoicingInvoiceAction, updateInvoicingInvoice, } from './view/invoicing/invoiceAction/invoiceActionReducer';
@@ -1194,6 +1194,12 @@ export type { InvoicingBrandingFormView, InvoicingSettingsView, } from './view/i
1194
1194
  export type { InvoicingBrandingFormLocalData } from './view/invoicing/settingsView/invoicingBrandingFormConfig';
1195
1195
  export { INVOICING_BUSINESS_ADDRESS_TYPE, entityToInvoicingBrandingFormLocalData, initialInvoicingBrandingFormLocalData, } from './view/invoicing/settingsView/invoicingBrandingFormConfig';
1196
1196
  export { isStripeConnectedFromSettings } from './view/invoicing/settingsView/invoicingSettingsHelpers';
1197
+ export { clearInvoicingQboView, fetchInvoicingQboAccounts, fetchInvoicingQboClasses, fetchInvoicingQboConnection, fetchInvoicingQboSyncHealth, retryInvoicingQboSyncTask, startInvoicingQboBackfill, } from './view/invoicing/invoicingQboView/invoicingQboViewReducer';
1198
+ export { getInvoicingQboView } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
1199
+ export type { InvoicingQboView } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
1200
+ export type { InvoicingQboAccountOption, InvoicingQboConnection, InvoicingQboFailedTask, InvoicingQboSyncHealth, } from './view/invoicing/invoicingQboView/invoicingQboViewPayload';
1201
+ export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingQboCustomerMatchingMode, withInvoicingQboAccountMappingId, } from './entity/invoicing/invoicingCommonPayload';
1202
+ export type { InvoicingNamedOption, InvoicingQboAccountMappingKindOption, InvoicingQboAccountMappingsPayload, InvoicingQboCustomerMatchingMode, InvoicingQboSettingsPayload, } from './entity/invoicing/invoicingCommonPayload';
1197
1203
  export { acceptInvoicingTerms, clearInvoicingConfig, enableInvoicing, fetchInvoicingConfig, resetInvoicingConfigActionStates, updateInvoicingConfig, } from './view/invoicing/invoicingConfigView/invoicingConfigViewReducer';
1198
1204
  export { getInvoicingConfigView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
1199
1205
  export type { InvoicingConfigView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
package/lib/index.js CHANGED
@@ -83,7 +83,7 @@ exports.INVOICING_LIST_PAGE_SIZE = exports.getInvoicingDataImportActionState = e
83
83
  exports.getInvoicingSubscriptionById = exports.fetchInvoicingSubscriptionDetail = exports.clearInvoicingSubscriptionDetailView = exports.getInvoicingSubscriptionListView = exports.INVOICING_SUBSCRIPTION_TABS = exports.INVOICING_SUBSCRIPTION_COLUMNS = exports.ALL_INVOICING_SUBSCRIPTION_TAB_IDS = exports.ALL_INVOICING_SUBSCRIPTION_SORT_KEYS = exports.updateInvoicingSubscriptionFilters = exports.setInvoicingSubscriptionActiveTab = exports.fetchInvoicingSubscriptionListPage = exports.fetchInvoicingSubscriptionList = exports.fetchInvoicingSubscriptionCounts = exports.clearInvoicingSubscriptionListView = exports.updateInvoicingSubscriptions = exports.removeInvoicingSubscription = exports.clearAllInvoicingSubscriptions = exports.resetPromotionalCreditAction = exports.submitAddPromotionalCredits = exports.getInvoicingSetupIntentFetchState = exports.getInvoicingSetupIntent = exports.getInvoicingSentPaymentLinkMagicUrl = exports.getInvoicingSentPaymentLinkEmail = exports.getInvoicingPlaidLinkTokenFetchState = exports.getInvoicingPlaidLinkToken = exports.getInvoicingPaymentMethodSaveState = exports.getInvoicingPaymentLinkSendState = exports.sendInvoicingPaymentLink = exports.saveInvoicingPaymentMethod = exports.resetInvoicingCustomerPaymentMethod = exports.fetchInvoicingPlaidLinkToken = exports.createInvoicingSetupIntent = exports.getInvoicingCustomerDetail = exports.fetchInvoicingCustomerDetailPage = exports.fetchInvoicingCustomerDetail = exports.clearInvoicingCustomerDetailView = exports.getInvoicingCustomerListView = exports.INVOICING_CUSTOMER_TABS = exports.INVOICING_CUSTOMER_COLUMNS = exports.ALL_INVOICING_CUSTOMER_TAB_IDS = exports.ALL_INVOICING_CUSTOMER_SORT_KEYS = exports.updateInvoicingCustomerFilters = exports.setInvoicingCustomerActiveTab = exports.fetchInvoicingCustomerListPage = exports.fetchInvoicingCustomerList = exports.fetchInvoicingCustomerCounts = exports.clearInvoicingCustomerListView = exports.updateInvoicingCustomers = exports.removeInvoicingCustomer = exports.clearAllInvoicingCustomers = void 0;
84
84
  exports.getInvoicingCouponCounts = exports.INVOICING_COUPON_TABS = exports.INVOICING_COUPON_COLUMNS = exports.ALL_INVOICING_COUPON_TAB_IDS = exports.ALL_INVOICING_COUPON_SORT_KEYS = exports.updateInvoicingCouponFilters = exports.setInvoicingCouponActiveTab = exports.fetchInvoicingCouponListPage = exports.fetchInvoicingCouponList = exports.fetchInvoicingCouponCounts = exports.clearInvoicingCouponView = exports.updateInvoicingCoupons = exports.removeInvoicingCoupon = exports.clearAllInvoicingCoupons = exports.getInvoicingCreditNoteDetail = exports.getInvoicingCreditNoteById = exports.fetchInvoicingCreditNoteDetail = exports.clearInvoicingCreditNoteDetailView = exports.getInvoicingCreditNoteListView = exports.INVOICING_CREDIT_NOTE_TABS = exports.INVOICING_CREDIT_NOTE_COLUMNS = exports.ALL_INVOICING_CREDIT_NOTE_TAB_IDS = exports.ALL_INVOICING_CREDIT_NOTE_SORT_KEYS = exports.updateInvoicingCreditNoteFilters = exports.setInvoicingCreditNoteActiveTab = exports.fetchInvoicingCreditNoteListPage = exports.fetchInvoicingCreditNoteList = exports.fetchInvoicingCreditNoteCounts = exports.clearInvoicingCreditNoteListView = exports.updateInvoicingCreditNotes = exports.removeInvoicingCreditNote = exports.clearAllInvoicingCreditNotes = exports.getInvoicingTransactionDetail = exports.getInvoicingTransactionById = exports.fetchInvoicingTransactionDetail = exports.clearInvoicingTransactionDetailView = exports.getInvoicingTransactionListView = exports.INVOICING_TRANSACTION_TABS = exports.INVOICING_TRANSACTION_COLUMNS = exports.ALL_INVOICING_TRANSACTION_TAB_IDS = exports.ALL_INVOICING_TRANSACTION_SORT_KEYS = exports.updateInvoicingTransactionFilters = exports.setInvoicingTransactionActiveTab = exports.fetchInvoicingTransactionListPage = exports.fetchInvoicingTransactionList = exports.clearInvoicingTransactionListView = exports.updateInvoicingTransactions = exports.removeInvoicingTransaction = exports.clearAllInvoicingTransactions = exports.getInvoicingSubscriptionDetail = void 0;
85
85
  exports.getInvoicingProductById = exports.getInvoicingPlanById = exports.getInvoicingCatalogItemDetail = exports.fetchInvoicingCatalogItemDetail = exports.clearInvoicingCatalogItemDetailView = exports.getInvoicingCatalogListView = exports.INVOICING_PRODUCT_COLUMNS = exports.ALL_INVOICING_PRODUCT_SORT_KEYS = exports.updateInvoicingCatalogProductFilters = exports.updateInvoicingCatalogPlanFilters = exports.fetchInvoicingCatalogProductList = exports.fetchInvoicingCatalogPlanList = exports.fetchInvoicingCatalogListPage = exports.fetchInvoicingCatalogCounts = exports.clearInvoicingCatalogListView = exports.updateInvoicingProducts = exports.removeInvoicingProduct = exports.clearAllInvoicingProducts = exports.updateInvoicingPlans = exports.removeInvoicingPlan = exports.mergeInvoicingPlanSubFamily = exports.clearAllInvoicingPlans = exports.getInvoicingDunningCaseDetail = exports.getInvoicingDunningCaseById = exports.fetchInvoicingDunningCaseDetail = exports.clearInvoicingDunningCaseDetailView = exports.getInvoicingDunningCaseListView = exports.INVOICING_DUNNING_CASE_TABS = exports.INVOICING_DUNNING_CASE_COLUMNS = exports.ALL_INVOICING_DUNNING_CASE_TAB_IDS = exports.ALL_INVOICING_DUNNING_CASE_SORT_KEYS = exports.updateInvoicingDunningCaseFilters = exports.setInvoicingDunningCaseActiveTab = exports.fetchInvoicingDunningCaseListPage = exports.fetchInvoicingDunningCaseList = exports.fetchInvoicingDunningCaseCounts = exports.clearInvoicingDunningCaseListView = exports.updateInvoicingDunningCases = exports.removeInvoicingDunningCase = exports.clearAllInvoicingDunningCases = exports.getInvoicingCouponDetail = exports.fetchInvoicingCouponDetail = exports.clearInvoicingCouponDetailView = exports.getInvoicingCouponById = exports.getInvoicingCouponListView = exports.getInvoicingCouponListNextCursor = exports.getInvoicingCouponListItems = exports.getInvoicingCouponListHasMore = exports.getInvoicingCouponListFilters = exports.getInvoicingCouponListFetchState = void 0;
86
- exports.getInvoicingConfigView = exports.updateInvoicingConfig = exports.resetInvoicingConfigActionStates = exports.fetchInvoicingConfig = exports.enableInvoicing = exports.clearInvoicingConfig = exports.acceptInvoicingTerms = exports.isStripeConnectedFromSettings = exports.initialInvoicingBrandingFormLocalData = exports.entityToInvoicingBrandingFormLocalData = exports.INVOICING_BUSINESS_ADDRESS_TYPE = exports.getInvoicingSettingsView = exports.getInvoicingSettingsFetchState = exports.getInvoicingSettings = exports.getInvoicingBrandingFormView = exports.updateInvoicingSettings = exports.updateInvoicingBrandingFormDraft = exports.submitInvoicingBrandingForm = exports.saveInvoicingSettings = exports.resetSaveInvoicingSettings = exports.resetInvoicingBrandingFormDraft = exports.fetchInvoicingSettings = exports.disconnectInvoicingStripe = exports.connectInvoicingStripe = exports.clearInvoicingSettings = void 0;
86
+ exports.getInvoicingConfigView = exports.updateInvoicingConfig = exports.resetInvoicingConfigActionStates = exports.fetchInvoicingConfig = exports.enableInvoicing = exports.clearInvoicingConfig = exports.acceptInvoicingTerms = exports.withInvoicingQboAccountMappingId = exports.toInvoicingQboCustomerMatchingMode = exports.getInvoicingQboAccountMappingId = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.getInvoicingQboView = exports.startInvoicingQboBackfill = exports.retryInvoicingQboSyncTask = exports.fetchInvoicingQboSyncHealth = exports.fetchInvoicingQboConnection = exports.fetchInvoicingQboClasses = exports.fetchInvoicingQboAccounts = exports.clearInvoicingQboView = exports.isStripeConnectedFromSettings = exports.initialInvoicingBrandingFormLocalData = exports.entityToInvoicingBrandingFormLocalData = exports.INVOICING_BUSINESS_ADDRESS_TYPE = exports.getInvoicingSettingsView = exports.getInvoicingSettingsFetchState = exports.getInvoicingSettings = exports.getInvoicingBrandingFormView = exports.updateInvoicingSettings = exports.updateInvoicingBrandingFormDraft = exports.submitInvoicingBrandingForm = exports.saveInvoicingSettings = exports.resetSaveInvoicingSettings = exports.resetInvoicingBrandingFormDraft = exports.fetchInvoicingSettings = exports.disconnectInvoicingStripe = exports.connectInvoicingStripe = exports.clearInvoicingSettings = void 0;
87
87
  const allowedValue_1 = require("./commonStateTypes/allowedValue");
88
88
  Object.defineProperty(exports, "isAllowedValueWithCode", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithCode; } });
89
89
  Object.defineProperty(exports, "isAllowedValueWithID", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithID; } });
@@ -2801,9 +2801,9 @@ Object.defineProperty(exports, "resetEditInvoicingCouponDetailView", { enumerabl
2801
2801
  Object.defineProperty(exports, "saveInvoicingCoupon", { enumerable: true, get: function () { return editInvoicingCouponDetailViewReducer_1.saveInvoicingCoupon; } });
2802
2802
  Object.defineProperty(exports, "submitInvoicingCouponForm", { enumerable: true, get: function () { return editInvoicingCouponDetailViewReducer_1.submitInvoicingCouponForm; } });
2803
2803
  Object.defineProperty(exports, "updateInvoicingCouponFormDraft", { enumerable: true, get: function () { return editInvoicingCouponDetailViewReducer_1.updateInvoicingCouponFormDraft; } });
2804
- var invoicingCouponFormConfig_1 = require("./view/invoicing/editInvoicingCouponDetailView/invoicingCouponFormConfig");
2805
- Object.defineProperty(exports, "entityToInvoicingCouponFormLocalData", { enumerable: true, get: function () { return invoicingCouponFormConfig_1.entityToInvoicingCouponFormLocalData; } });
2806
- Object.defineProperty(exports, "initialInvoicingCouponFormLocalData", { enumerable: true, get: function () { return invoicingCouponFormConfig_1.initialInvoicingCouponFormLocalData; } });
2804
+ var editInvoicingCouponDetailViewState_1 = require("./view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewState");
2805
+ Object.defineProperty(exports, "entityToInvoicingCouponFormLocalData", { enumerable: true, get: function () { return editInvoicingCouponDetailViewState_1.entityToInvoicingCouponFormLocalData; } });
2806
+ Object.defineProperty(exports, "initialInvoicingCouponFormLocalData", { enumerable: true, get: function () { return editInvoicingCouponDetailViewState_1.initialInvoicingCouponFormLocalData; } });
2807
2807
  var editInvoicingCouponDetailViewSelector_1 = require("./view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector");
2808
2808
  Object.defineProperty(exports, "getEditInvoicingCouponDetailViewState", { enumerable: true, get: function () { return editInvoicingCouponDetailViewSelector_1.getEditInvoicingCouponDetailViewState; } });
2809
2809
  Object.defineProperty(exports, "getInvoicingCouponFormView", { enumerable: true, get: function () { return editInvoicingCouponDetailViewSelector_1.getInvoicingCouponFormView; } });
@@ -3090,6 +3090,22 @@ Object.defineProperty(exports, "entityToInvoicingBrandingFormLocalData", { enume
3090
3090
  Object.defineProperty(exports, "initialInvoicingBrandingFormLocalData", { enumerable: true, get: function () { return invoicingBrandingFormConfig_1.initialInvoicingBrandingFormLocalData; } });
3091
3091
  var invoicingSettingsHelpers_1 = require("./view/invoicing/settingsView/invoicingSettingsHelpers");
3092
3092
  Object.defineProperty(exports, "isStripeConnectedFromSettings", { enumerable: true, get: function () { return invoicingSettingsHelpers_1.isStripeConnectedFromSettings; } });
3093
+ // ── Invoicing: QBO integration ────────────────────────────────────────────────
3094
+ var invoicingQboViewReducer_1 = require("./view/invoicing/invoicingQboView/invoicingQboViewReducer");
3095
+ Object.defineProperty(exports, "clearInvoicingQboView", { enumerable: true, get: function () { return invoicingQboViewReducer_1.clearInvoicingQboView; } });
3096
+ Object.defineProperty(exports, "fetchInvoicingQboAccounts", { enumerable: true, get: function () { return invoicingQboViewReducer_1.fetchInvoicingQboAccounts; } });
3097
+ Object.defineProperty(exports, "fetchInvoicingQboClasses", { enumerable: true, get: function () { return invoicingQboViewReducer_1.fetchInvoicingQboClasses; } });
3098
+ Object.defineProperty(exports, "fetchInvoicingQboConnection", { enumerable: true, get: function () { return invoicingQboViewReducer_1.fetchInvoicingQboConnection; } });
3099
+ Object.defineProperty(exports, "fetchInvoicingQboSyncHealth", { enumerable: true, get: function () { return invoicingQboViewReducer_1.fetchInvoicingQboSyncHealth; } });
3100
+ Object.defineProperty(exports, "retryInvoicingQboSyncTask", { enumerable: true, get: function () { return invoicingQboViewReducer_1.retryInvoicingQboSyncTask; } });
3101
+ Object.defineProperty(exports, "startInvoicingQboBackfill", { enumerable: true, get: function () { return invoicingQboViewReducer_1.startInvoicingQboBackfill; } });
3102
+ var invoicingQboViewSelector_1 = require("./view/invoicing/invoicingQboView/invoicingQboViewSelector");
3103
+ Object.defineProperty(exports, "getInvoicingQboView", { enumerable: true, get: function () { return invoicingQboViewSelector_1.getInvoicingQboView; } });
3104
+ var invoicingCommonPayload_2 = require("./entity/invoicing/invoicingCommonPayload");
3105
+ Object.defineProperty(exports, "INVOICING_QBO_CUSTOMER_MATCHING_MODES", { enumerable: true, get: function () { return invoicingCommonPayload_2.INVOICING_QBO_CUSTOMER_MATCHING_MODES; } });
3106
+ Object.defineProperty(exports, "getInvoicingQboAccountMappingId", { enumerable: true, get: function () { return invoicingCommonPayload_2.getInvoicingQboAccountMappingId; } });
3107
+ Object.defineProperty(exports, "toInvoicingQboCustomerMatchingMode", { enumerable: true, get: function () { return invoicingCommonPayload_2.toInvoicingQboCustomerMatchingMode; } });
3108
+ Object.defineProperty(exports, "withInvoicingQboAccountMappingId", { enumerable: true, get: function () { return invoicingCommonPayload_2.withInvoicingQboAccountMappingId; } });
3093
3109
  // ── Invoicing: config ─────────────────────────────────────────────────────────
3094
3110
  var invoicingConfigViewReducer_1 = require("./view/invoicing/invoicingConfigView/invoicingConfigViewReducer");
3095
3111
  Object.defineProperty(exports, "acceptInvoicingTerms", { enumerable: true, get: function () { return invoicingConfigViewReducer_1.acceptInvoicingTerms; } });
package/lib/reducer.d.ts CHANGED
@@ -153,6 +153,7 @@ import { InvoicingCustomerListViewState } from './view/invoicing/invoicingCustom
153
153
  import { InvoicingDunningCaseDetailViewState } from './view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewState';
154
154
  import { InvoicingDunningCaseListViewState } from './view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewState';
155
155
  import { InvoicingOverviewState } from './view/invoicing/invoicingOverview/invoicingOverviewState';
156
+ import { InvoicingQboViewState } from './view/invoicing/invoicingQboView/invoicingQboViewState';
156
157
  import { InvoicingSubscriptionDetailViewState } from './view/invoicing/invoicingSubscriptionDetailView/invoicingSubscriptionDetailViewState';
157
158
  import { InvoicingSubscriptionListViewState } from './view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState';
158
159
  import { InvoicingTransactionDetailViewState } from './view/invoicing/invoicingTransactionDetailView/invoicingTransactionDetailViewState';
@@ -466,6 +467,7 @@ type ViewsState = {
466
467
  invoicingOverviewState: InvoicingOverviewState;
467
468
  invoicingPaymentActionState: InvoicingPaymentActionState;
468
469
  invoicingPromotionalCreditActionState: PromotionalCreditActionState;
470
+ invoicingQboViewState: InvoicingQboViewState;
469
471
  invoicingRecordPaymentState: InvoicingRecordPaymentState;
470
472
  invoicingSettingsViewState: InvoicingSettingsViewState;
471
473
  invoicingSubscriptionActionState: InvoicingSubscriptionActionState;
@@ -666,6 +668,7 @@ declare const reducers: import("redux").Reducer<import("redux").CombinedState<{
666
668
  invoicingInvoiceListState: InvoicingInvoiceListState;
667
669
  invoicingPaymentActionState: InvoicingPaymentActionState;
668
670
  invoicingConfigViewState: InvoicingConfigViewState;
671
+ invoicingQboViewState: InvoicingQboViewState;
669
672
  invoicingSettingsViewState: InvoicingSettingsViewState;
670
673
  invoicingCatalogActionState: InvoicingCatalogActionState;
671
674
  invoicingDiscountActionState: InvoicingDiscountActionState;
package/lib/reducer.js CHANGED
@@ -194,6 +194,7 @@ const invoicingCustomerListViewReducer_1 = __importStar(require("./view/invoicin
194
194
  const invoicingDunningCaseDetailViewReducer_1 = __importStar(require("./view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewReducer"));
195
195
  const invoicingDunningCaseListViewReducer_1 = __importStar(require("./view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer"));
196
196
  const invoicingOverviewReducer_1 = __importStar(require("./view/invoicing/invoicingOverview/invoicingOverviewReducer"));
197
+ const invoicingQboViewReducer_1 = __importStar(require("./view/invoicing/invoicingQboView/invoicingQboViewReducer"));
197
198
  const invoicingSubscriptionDetailViewReducer_1 = __importStar(require("./view/invoicing/invoicingSubscriptionDetailView/invoicingSubscriptionDetailViewReducer"));
198
199
  const invoicingSubscriptionListViewReducer_1 = __importStar(require("./view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer"));
199
200
  const invoicingTransactionDetailViewReducer_1 = __importStar(require("./view/invoicing/invoicingTransactionDetailView/invoicingTransactionDetailViewReducer"));
@@ -504,6 +505,7 @@ const initialViewsState = {
504
505
  invoicingInvoiceListState: invoiceListReducer_1.initialState,
505
506
  invoicingPaymentActionState: paymentActionReducer_1.initialState,
506
507
  invoicingConfigViewState: invoicingConfigViewReducer_1.initialState,
508
+ invoicingQboViewState: invoicingQboViewReducer_1.initialState,
507
509
  invoicingSettingsViewState: settingsViewReducer_1.initialState,
508
510
  invoicingCatalogActionState: catalogActionReducer_1.initialState,
509
511
  invoicingDiscountActionState: discountActionReducer_1.initialState,
@@ -793,6 +795,7 @@ const viewReducers = {
793
795
  invoicingInvoiceListState: invoiceListReducer_1.default,
794
796
  invoicingPaymentActionState: paymentActionReducer_1.default,
795
797
  invoicingConfigViewState: invoicingConfigViewReducer_1.default,
798
+ invoicingQboViewState: invoicingQboViewReducer_1.default,
796
799
  invoicingSettingsViewState: settingsViewReducer_1.default,
797
800
  invoicingCatalogActionState: catalogActionReducer_1.default,
798
801
  invoicingDiscountActionState: discountActionReducer_1.default,
@@ -3,7 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.initialCreateCreditNoteFormLocalData = void 0;
4
4
  const initialCreateCreditNoteFormLocalData = () => ({
5
5
  customerId: '',
6
- lineItems: [{ description: '', quantity: '1', unitAmount: '' }],
6
+ lineItems: [
7
+ {
8
+ description: '',
9
+ quantity: '1',
10
+ },
11
+ ],
7
12
  reasonCode: '',
8
13
  referenceInvoiceId: '',
9
14
  });
@@ -1,18 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.localDataToCreateCreditNotePayload = void 0;
4
- const dollarsFromAmountString = (value) => {
5
- const parsed = Number.parseFloat(value);
6
- if (Number.isNaN(parsed)) {
7
- return 0;
8
- }
9
- return parsed;
10
- };
11
4
  const localDataToCreateCreditNotePayload = (localData) => {
12
5
  const lineItems = localData.lineItems
13
6
  .map((lineItem) => {
14
7
  const quantity = Math.round(Number.parseFloat(lineItem.quantity));
15
- const unitAmount = dollarsFromAmountString(lineItem.unitAmount);
8
+ const unitAmount = lineItem.unitAmount?.amount ?? 0;
16
9
  return {
17
10
  description: lineItem.description.trim(),
18
11
  quantity,
@@ -1,8 +1,10 @@
1
+ import { Amount } from '../../../commonStateTypes/amount';
1
2
  import { FetchedState, ID } from '../../../commonStateTypes/common';
2
3
  export interface CreateCreditNoteLineItemDraft {
3
4
  description: string;
4
5
  quantity: string;
5
- unitAmount: string;
6
+ /** Unset until entered, so a blank field is distinguishable from a real 0. */
7
+ unitAmount?: Amount;
6
8
  }
7
9
  export interface CreateCreditNoteFormLocalData {
8
10
  customerId: string;
@@ -1,3 +1,4 @@
1
+ import { Amount } from '../../../commonStateTypes/amount';
1
2
  import type { InvoicingPlan } from '../../../entity/invoicing/plan/planState';
2
3
  import type { InvoicingProduct } from '../../../entity/invoicing/product/productState';
3
4
  import type { InvoicingCatalogItemFormSubFamily } from './editInvoicingCatalogItemDetailViewState';
@@ -39,12 +40,12 @@ export interface CreateSubFamilyFormValues {
39
40
  period: string;
40
41
  periodUnit: string;
41
42
  priceCode: string;
42
- priceDollars: string;
43
43
  pricingModel: string;
44
44
  prorationType: string;
45
45
  trialEndAction: string;
46
46
  trialPeriod: string;
47
47
  trialPeriodUnit: string;
48
+ priceDollars?: Amount;
48
49
  }
49
50
  /** Build POST /catalog/products body for Create sub-family. */
50
51
  export declare const createSubFamilyFormToPayload: (itemId: string, itemType: string, values: CreateSubFamilyFormValues) => Record<string, unknown>;