@zeniai/client-epic-state 4.19.77-betaAK4 → 4.19.77-betaAK6

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.

Potentially problematic release.


This version of @zeniai/client-epic-state might be problematic. Click here for more details.

Files changed (19) hide show
  1. package/lib/esm/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.js +1 -3
  2. package/lib/esm/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.js.map +1 -1
  3. package/lib/esm/view/transactionDetail/epics/transactionDetailEpic.js +18 -9
  4. package/lib/esm/view/transactionDetail/epics/transactionDetailEpic.js.map +1 -1
  5. package/lib/esm/view/transactionDetail/epics/updateTransactionDetailEpic.js +7 -4
  6. package/lib/esm/view/transactionDetail/epics/updateTransactionDetailEpic.js.map +1 -1
  7. package/lib/esm/view/transactionDetail/transactionDetailState.js +14 -2
  8. package/lib/esm/view/transactionDetail/transactionDetailState.js.map +1 -1
  9. package/lib/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.js +1 -3
  10. package/lib/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.js.map +1 -1
  11. package/lib/view/transactionDetail/epics/transactionDetailEpic.js +18 -9
  12. package/lib/view/transactionDetail/epics/transactionDetailEpic.js.map +1 -1
  13. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.d.ts +2 -2
  14. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.js +6 -3
  15. package/lib/view/transactionDetail/epics/updateTransactionDetailEpic.js.map +1 -1
  16. package/lib/view/transactionDetail/transactionDetailState.d.ts +1 -1
  17. package/lib/view/transactionDetail/transactionDetailState.js +14 -2
  18. package/lib/view/transactionDetail/transactionDetailState.js.map +1 -1
  19. package/package.json +54 -28
@@ -4,13 +4,11 @@ import { getSupportedTransactionById } from '../../../entity/transaction/transac
4
4
  import { getUncategorizedAccounts } from '../../accountList/accountListSelector';
5
5
  import { toTransactionDetailLocalData } from '../transactionDetailLocalDataHelper';
6
6
  import { clearTransactionDetailLocalData, initializeTransactionDetailLocalData, saveTransactionDetailLocalData, } from '../transactionDetailReducer';
7
- import { getTransactionDetailKey } from '../transactionDetailState';
8
7
  export const initializeTransactionDetailLocalDataEpic = (actions$, state$) => actions$.pipe(filter(initializeTransactionDetailLocalData.match), mergeMap((action) => {
9
8
  const { transactionId, vendorId } = action.payload;
10
9
  const fetchActions = [];
11
10
  const transactionState = state$.value.transactionState;
12
- const key = getTransactionDetailKey(transactionId);
13
- const detail = getSupportedTransactionById(transactionState, key);
11
+ const detail = getSupportedTransactionById(transactionState, transactionId.id); // entity store uses full zeni ID as canonical key
14
12
  if (detail != null) {
15
13
  const uncategorizedIncomeExpense = getUncategorizedAccounts(state$.value.accountState, state$.value.accountListState, 'accountList');
16
14
  const localData = toTransactionDetailLocalData(detail, vendorId, uncategorizedIncomeExpense);
@@ -1 +1 @@
1
- {"version":3,"file":"initializeTransactionDetailLocalDataEpic.js","sourceRoot":"","sources":["../../../../../src/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAC,2BAA2B,EAAC,MAAM,iDAAiD,CAAC;AAE5F,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,4BAA4B,EAAC,MAAM,qCAAqC,CAAC;AACjF,OAAO,EACL,+BAA+B,EAC/B,oCAAoC,EACpC,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAOlE,MAAM,CAAC,MAAM,wCAAwC,GAAG,CACtD,QAAuC,EACvC,MAAkC,EAClC,EAAE,CACF,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,oCAAoC,CAAC,KAAK,CAAC,EAClD,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;IAClB,MAAM,EAAC,aAAa,EAAE,QAAQ,EAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACjD,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,GAAG,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,2BAA2B,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,0BAA0B,GAAG,wBAAwB,CACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAC7B,aAAa,CACd,CAAC;QACF,MAAM,SAAS,GAAG,4BAA4B,CAC5C,MAAM,EACN,QAAQ,EACR,0BAA0B,CAC3B,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAC,aAAa,EAAC,CAAC,CAAC,CAAC;QACpE,YAAY,CAAC,IAAI,CACf,8BAA8B,CAAC;YAC7B,aAAa;YACb,oBAAoB,EAAE,SAAS;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC,CAAC,CACH,CAAC","sourcesContent":["import {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from} from 'rxjs';\nimport {filter, mergeMap} from 'rxjs/operators';\n\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {RootState} from '../../../reducer';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {toTransactionDetailLocalData} from '../transactionDetailLocalDataHelper';\nimport {\n clearTransactionDetailLocalData,\n initializeTransactionDetailLocalData,\n saveTransactionDetailLocalData,\n} from '../transactionDetailReducer';\nimport {getTransactionDetailKey} from '../transactionDetailState';\n\nexport type ActionType =\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof saveTransactionDetailLocalData>\n | ReturnType<typeof clearTransactionDetailLocalData>;\n\nexport const initializeTransactionDetailLocalDataEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>\n) =>\n actions$.pipe(\n filter(initializeTransactionDetailLocalData.match),\n mergeMap((action) => {\n const {transactionId, vendorId} = action.payload;\n const fetchActions: ActionType[] = [];\n const transactionState = state$.value.transactionState;\n const key = getTransactionDetailKey(transactionId);\n const detail = getSupportedTransactionById(transactionState, key);\n if (detail != null) {\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n const localData = toTransactionDetailLocalData(\n detail,\n vendorId,\n uncategorizedIncomeExpense\n );\n fetchActions.push(clearTransactionDetailLocalData({transactionId}));\n fetchActions.push(\n saveTransactionDetailLocalData({\n transactionId,\n transactionLocalData: localData,\n })\n );\n }\n return from(fetchActions);\n })\n );\n"]}
1
+ {"version":3,"file":"initializeTransactionDetailLocalDataEpic.js","sourceRoot":"","sources":["../../../../../src/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAC,2BAA2B,EAAC,MAAM,iDAAiD,CAAC;AAE5F,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,4BAA4B,EAAC,MAAM,qCAAqC,CAAC;AACjF,OAAO,EACL,+BAA+B,EAC/B,oCAAoC,EACpC,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AAOrC,MAAM,CAAC,MAAM,wCAAwC,GAAG,CACtD,QAAuC,EACvC,MAAkC,EAClC,EAAE,CACF,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,oCAAoC,CAAC,KAAK,CAAC,EAClD,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;IAClB,MAAM,EAAC,aAAa,EAAE,QAAQ,EAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACjD,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,MAAM,GAAG,2BAA2B,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,kDAAkD;IAClI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,0BAA0B,GAAG,wBAAwB,CACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAC7B,aAAa,CACd,CAAC;QACF,MAAM,SAAS,GAAG,4BAA4B,CAC5C,MAAM,EACN,QAAQ,EACR,0BAA0B,CAC3B,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAC,aAAa,EAAC,CAAC,CAAC,CAAC;QACpE,YAAY,CAAC,IAAI,CACf,8BAA8B,CAAC;YAC7B,aAAa;YACb,oBAAoB,EAAE,SAAS;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC,CAAC,CACH,CAAC","sourcesContent":["import {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from} from 'rxjs';\nimport {filter, mergeMap} from 'rxjs/operators';\n\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {RootState} from '../../../reducer';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {toTransactionDetailLocalData} from '../transactionDetailLocalDataHelper';\nimport {\n clearTransactionDetailLocalData,\n initializeTransactionDetailLocalData,\n saveTransactionDetailLocalData,\n} from '../transactionDetailReducer';\n\nexport type ActionType =\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof saveTransactionDetailLocalData>\n | ReturnType<typeof clearTransactionDetailLocalData>;\n\nexport const initializeTransactionDetailLocalDataEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>\n) =>\n actions$.pipe(\n filter(initializeTransactionDetailLocalData.match),\n mergeMap((action) => {\n const {transactionId, vendorId} = action.payload;\n const fetchActions: ActionType[] = [];\n const transactionState = state$.value.transactionState;\n const detail = getSupportedTransactionById(transactionState, transactionId.id); // entity store uses full zeni ID as canonical key\n if (detail != null) {\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n const localData = toTransactionDetailLocalData(\n detail,\n vendorId,\n uncategorizedIncomeExpense\n );\n fetchActions.push(clearTransactionDetailLocalData({transactionId}));\n fetchActions.push(\n saveTransactionDetailLocalData({\n transactionId,\n transactionLocalData: localData,\n })\n );\n }\n return from(fetchActions);\n })\n );\n"]}
@@ -21,7 +21,7 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
21
21
  const detailKey = getTransactionDetailKey(transactionId);
22
22
  const transactionActions = [];
23
23
  if (cacheOverride === true) {
24
- const transaction = getSupportedTransactionById(state$.value.transactionState, detailKey);
24
+ const transaction = getSupportedTransactionById(state$.value.transactionState, transactionId.id);
25
25
  transactionActions.push(...removeCompleteTransaction(transactionId, transaction));
26
26
  }
27
27
  const transactionDetail = recordGet(state$.value.transactionDetailState.transactionDetailById, detailKey, undefined);
@@ -46,6 +46,12 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
46
46
  //
47
47
  // The entity store canonical key is the full zeni ID (transactionId.id),
48
48
  // which is the same key used by all list-fetch epics.
49
+ //
50
+ // DEPENDENCY: The web-components TransactionDetailPage sets effectiveIsDisabled
51
+ // to "disabled" while fetchState !== "Completed". This prevents any user edits
52
+ // between this early init and the second init dispatched on API response (below).
53
+ // If that guard is ever removed, user edits made against partial list data will
54
+ // be silently overwritten when the full detail response arrives.
49
55
  if (cacheOverride !== true) {
50
56
  const existingTransaction = getSupportedTransactionById(state$.value.transactionState, transactionId.id);
51
57
  if (existingTransaction != null) {
@@ -62,7 +68,7 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
62
68
  if (isSuccessResponse(response) &&
63
69
  response.data?.transaction?.transaction_id != null) {
64
70
  const updateActions = [];
65
- const transcationId = toTransactionID(response.data.transaction);
71
+ const responseTransactionId = toTransactionID(response.data.transaction);
66
72
  const responseData = {
67
73
  ...response.data,
68
74
  vendors: response.data.vendors?.map((vendor) => ({
@@ -73,15 +79,15 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
73
79
  if (responseData.vendors.length > 0) {
74
80
  updateActions.push(updateVendors(responseData.vendors, 'merge'));
75
81
  }
76
- // Use the full zeni ID (transcationId.id) as the entity store key
77
- // so it matches how all list-fetch epics save transactions, avoiding
82
+ // Use the full zeni ID as the entity store key so it matches
83
+ // how all list-fetch epics save transactions, avoiding
78
84
  // duplicate entries under different key formats.
79
- updateActions.push(updateTransaction(transcationId.id, responseData.transaction));
85
+ updateActions.push(updateTransaction(responseTransactionId.id, responseData.transaction));
80
86
  updateActions.push(initializeTransactionDetailLocalData({
81
- transactionId: transcationId,
87
+ transactionId: responseTransactionId,
82
88
  vendorId: responseData.vendors[0]?.vendor_id,
83
89
  }));
84
- updateActions.push(updateTransactionDetailFetchState(transcationId, 'Completed'));
90
+ updateActions.push(updateTransactionDetailFetchState(responseTransactionId, 'Completed'));
85
91
  // IMPORTANT: Fetch linked transactions..
86
92
  updateActions.push(...getAllFetchLinkedTransactionDetailActions(responseData.transaction, state$.value));
87
93
  if (responseData.vendors.length > 0) {
@@ -116,12 +122,15 @@ function removeCompleteTransaction(transactionId, transaction) {
116
122
  const actions = [];
117
123
  actions.push(removeTransactionDetail(transactionId));
118
124
  if (transaction != null) {
119
- actions.push(removeTransaction(getTransactionDetailKey(transactionId)));
125
+ // Use transactionId.id (full zeni ID) — the canonical entity store key.
126
+ // getTransactionDetailKey produces a different composite key used only by
127
+ // transactionDetailState, not the entity store.
128
+ actions.push(removeTransaction(transactionId.id));
120
129
  // remove all the linked transactions too..
121
130
  const linkedTransactions = getAllLinkedTransactions(transaction);
122
131
  linkedTransactions.forEach((linkedTransaction) => {
123
132
  actions.push(removeTransactionDetail(linkedTransaction));
124
- actions.push(removeTransaction(getTransactionDetailKey(linkedTransaction)));
133
+ actions.push(removeTransaction(linkedTransaction.id));
125
134
  });
126
135
  }
127
136
  return actions;
@@ -1 +1 @@
1
- {"version":3,"file":"transactionDetailEpic.js","sourceRoot":"","sources":["../../../../../src/view/transactionDetail/epics/transactionDetailEpic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAa,MAAM,EAAE,IAAI,EAAE,EAAE,EAAC,MAAM,MAAM,CAAC;AAClD,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAC,eAAe,EAAC,MAAM,+DAA+D,CAAC;AAC9F,OAAO,EAEL,aAAa,GACd,MAAM,6DAA6D,CAAC;AAKrE,OAAO,EAAC,6BAA6B,EAAC,MAAM,wDAAwD,CAAC;AACrG,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAC,2BAA2B,EAAC,MAAM,iDAAiD,CAAC;AAC5F,OAAO,EAAC,wBAAwB,EAAC,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAC,aAAa,EAAC,MAAM,sCAAsC,CAAC;AAEnE,OAAO,EAAC,mBAAmB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAEhF,OAAO,EAAC,gBAAgB,EAAC,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAC,cAAc,EAAC,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAC,wCAAwC,EAAC,MAAM,+EAA+E,CAAC;AACvI,OAAO,EAAC,gCAAgC,EAAC,MAAM,2EAA2E,CAAC;AAC3H,OAAO,EAAC,cAAc,EAAC,MAAM,kCAAkC,CAAC;AAGhE,OAAO,EACL,sBAAsB,EACtB,oCAAoC,EACpC,uBAAuB,EACvB,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAgBnC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,QAAuC,EACvC,MAAkC,EAClC,OAAgB,EACQ,EAAE,CAC1B,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,EACpC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;IAClB,MAAM,EAAC,aAAa,EAAE,aAAa,EAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACtD,MAAM,SAAS,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,kBAAkB,GAAiB,EAAE,CAAC;IAE5C,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,2BAA2B,CAC7C,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAC7B,SAAS,CACV,CAAC;QACF,kBAAkB,CAAC,IAAI,CACrB,GAAG,yBAAyB,CAAC,aAAa,EAAE,WAAW,CAAC,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,SAAS,CACjC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,qBAAqB,EACzD,SAAS,EACT,SAAS,CACV,CAAC;IAEF,IACE,aAAa,KAAK,IAAI;QACtB,iBAAiB,IAAI,IAAI;QACzB,CAAC,iBAAiB,CAAC,aAAa,EAAE,KAAK,KAAK;YAC1C,iBAAiB,CAAC,UAAU,KAAK,aAAa,CAAC,EACjD,CAAC;QACD,MAAM,WAAW,GACf,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC;QACvD,IACE,WAAW,CAAC,aAAa,EAAE,KAAK,KAAK;YACrC,WAAW,CAAC,UAAU,KAAK,aAAa,EACxC,CAAC;YACD,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;QAC9C,IACE,SAAS,CAAC,aAAa,EAAE,KAAK,KAAK;YACnC,SAAS,CAAC,UAAU,KAAK,aAAa,EACtC,CAAC;YACD,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,kBAAkB,CAAC,IAAI,CACrB,iCAAiC,CAAC,aAAa,EAAE,aAAa,CAAC,CAChE,CAAC;QAEF,6EAA6E;QAC7E,8EAA8E;QAC9E,uEAAuE;QACvE,EAAE;QACF,yEAAyE;QACzE,sDAAsD;QACtD,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,mBAAmB,GAAG,2BAA2B,CACrD,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAC7B,aAAa,CAAC,EAAE,CACjB,CAAC;YACF,IAAI,mBAAmB,IAAI,IAAI,EAAE,CAAC;gBAChC,kBAAkB,CAAC,IAAI,CACrB,oCAAoC,CAAC;oBACnC,aAAa;oBACb,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;iBACvC,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,EAAC,gBAAgB,EAAE,aAAa,CAAC,IAAI,EAAC,CAAC;QACrD,MAAM,qBAAqB,GAAG,OAAO;aAClC,OAAO,CACN,GACE,OAAO,CAAC,YAAY,CAAC,0BACvB,qBAAqB,aAAa,CAAC,EAAE,UAAU,kBAAkB,CAC/D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CACtB,EAAE,CACJ;aACA,IAAI,CACH,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE;YACpB,IACE,iBAAiB,CAAC,QAAQ,CAAC;gBAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,IAAI,IAAI,EAClD,CAAC;gBACD,MAAM,aAAa,GAAiB,EAAE,CAAC;gBACvC,MAAM,aAAa,GAAG,eAAe,CACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAC1B,CAAC;gBAEF,MAAM,YAAY,GAAG;oBACnB,GAAG,QAAQ,CAAC,IAAI;oBAChB,OAAO,EACL,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBACtC,GAAG,MAAM;wBACT,SAAS,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS;qBAC7C,CAAC,CAAC,IAAI,EAAE;iBACZ,CAAC;gBAEF,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,aAAa,CAAC,IAAI,CAChB,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAC7C,CAAC;gBACJ,CAAC;gBACD,kEAAkE;gBAClE,qEAAqE;gBACrE,iDAAiD;gBACjD,aAAa,CAAC,IAAI,CAChB,iBAAiB,CACf,aAAa,CAAC,EAAE,EAChB,YAAY,CAAC,WAAW,CACzB,CACF,CAAC;gBACF,aAAa,CAAC,IAAI,CAChB,oCAAoC,CAAC;oBACnC,aAAa,EAAE,aAAa;oBAC5B,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;iBAC7C,CAAC,CACH,CAAC;gBACF,aAAa,CAAC,IAAI,CAChB,iCAAiC,CAAC,aAAa,EAAE,WAAW,CAAC,CAC9D,CAAC;gBACF,yCAAyC;gBACzC,aAAa,CAAC,IAAI,CAChB,GAAG,yCAAyC,CAC1C,YAAY,CAAC,WAAW,EACxB,MAAM,CAAC,KAAK,CACb,CACF,CAAC;gBACF,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,aAAa,CAAC,IAAI,CAChB,gCAAgC,CAAC;wBAC/B,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;wBAC3C,SAAS,EAAE,wCAAwC,CACjD,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClD;qBACF,CAAC,CACH,CAAC;gBACJ,CAAC;gBACD,2CAA2C;gBAC3C,IACE,6BAA6B,CAC3B,YAAY,CAAC,WAAW,CAAC,gBAAgB,CAC1C,IAAI,IAAI,EACT,CAAC;oBACD,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;gBACvC,CAAC;gBACD,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CACP,iCAAiC,CAC/B,MAAM,CAAC,OAAO,CAAC,aAAa,EAC5B,OAAO,EACP,QAAQ,CAAC,MAAM,CAChB,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;YACpD,OAAO,EAAE,CACP,iCAAiC,CAC/B,MAAM,CAAC,OAAO,CAAC,aAAa,EAC5B,OAAO,EACP,mBAAmB,CACjB,kBAAkB,EAClB,6BAA6B,KAAK,EAAE,CACrC,CACF,CACF,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEJ,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC,CAAC,CACH,CAAC;AAEJ;;GAEG;AAEH,SAAS,yBAAyB,CAChC,aAA4B,EAC5B,WAAoC;IAEpC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACxE,2CAA2C;QAC3C,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACjE,kBAAkB,CAAC,OAAO,CAAC,CAAC,iBAAiB,EAAE,EAAE;YAC/C,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CACV,iBAAiB,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAC9D,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oCAAoC,CAC3C,aAA4B,EAC5B,KAAgB;IAEhB,MAAM,SAAS,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAE7E,OAAO,CACL,MAAM,IAAI,IAAI;QACd,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,aAAa,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,yCAAyC,CAChD,kBAAsC,EACtC,KAAgB;IAEhB,MAAM,6BAA6B,GAE7B,EAAE,CAAC;IAET,MAAM,kBAAkB,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAC7D,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;IAEvE,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,MAAM,CACxD,CAAC,KAAK,EAAE,EAAE,CAAC,oCAAoC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CACxE,CAAC;IAEF,yBAAyB,CAAC,OAAO,CAAC,CAAC,wBAAwB,EAAE,EAAE,CAC7D,6BAA6B,CAAC,IAAI,CAChC,sBAAsB,CAAC,wBAAwB,EAAE,KAAK,CAAC,CACxD,CACF,CAAC;IACF,IAAI,yBAAyB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CACT,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,6BAA6B,CAAC;AACvC,CAAC","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {Observable, concat, from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {\n TransactionPayload,\n toTransaction,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n Transaction,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {toVendorTransactionTypeStrict} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n removeTransaction,\n updateTransaction,\n} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {mapVendorPayloadToVendor} from '../../../entity/vendor/vendorPayload';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {RootState} from '../../../reducer';\nimport {createZeniAPIStatus, isSuccessResponse} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {fetchAccountList} from '../../accountList/accountListReducer';\nimport {fetchClassList} from '../../classList/classListReducer';\nimport {getInitializedTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorLocalDataHelper';\nimport {updateTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorViewReducer';\nimport {fetchOwnerList} from '../../ownerList/ownerListReducer';\nimport {updateSortUiState} from '../../vendorList/vendorListReducer';\nimport {TransactionDetailResponse} from '../transactionDetailPayload';\nimport {\n fetchTransactionDetail,\n initializeTransactionDetailLocalData,\n removeTransactionDetail,\n updateTransactionDetailFetchState,\n} from '../transactionDetailReducer';\nimport {\n getAllLinkedTransactions,\n getTransactionDetailKey,\n} from '../transactionDetailState';\n\nexport type ActionType =\n | ReturnType<typeof fetchTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactionDetailFetchState>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof removeTransaction>\n | ReturnType<typeof removeTransactionDetail>\n | ReturnType<typeof fetchClassList>\n | ReturnType<typeof fetchAccountList>\n | ReturnType<typeof updateSortUiState>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof updateTransactionVendorLocalData>\n | ReturnType<typeof fetchOwnerList>;\n\nexport const fetchTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n): Observable<ActionType> =>\n actions$.pipe(\n filter(fetchTransactionDetail.match),\n mergeMap((action) => {\n const {transactionId, cacheOverride} = action.payload;\n const detailKey = getTransactionDetailKey(transactionId);\n const transactionActions: ActionType[] = [];\n\n if (cacheOverride === true) {\n const transaction = getSupportedTransactionById(\n state$.value.transactionState,\n detailKey\n );\n transactionActions.push(\n ...removeCompleteTransaction(transactionId, transaction)\n );\n }\n\n const transactionDetail = recordGet(\n state$.value.transactionDetailState.transactionDetailById,\n detailKey,\n undefined\n );\n\n if (\n cacheOverride === true ||\n transactionDetail == null ||\n (transactionDetail.hasValidState() === false &&\n transactionDetail.fetchState !== 'In-Progress')\n ) {\n const accountList =\n state$.value.accountListState.byReportId.accountList;\n if (\n accountList.hasValidState() === false &&\n accountList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchAccountList('accountList'));\n }\n const classList = state$.value.classListState;\n if (\n classList.hasValidState() === false &&\n classList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchClassList());\n }\n\n transactionActions.push(\n updateTransactionDetailFetchState(transactionId, 'In-Progress')\n );\n\n // If the transaction already exists in the entity store (e.g. fetched by the\n // list page), initialize local data immediately so the UI can render whatever\n // data is available while the full detail fetch completes in parallel.\n //\n // The entity store canonical key is the full zeni ID (transactionId.id),\n // which is the same key used by all list-fetch epics.\n if (cacheOverride !== true) {\n const existingTransaction = getSupportedTransactionById(\n state$.value.transactionState,\n transactionId.id\n );\n if (existingTransaction != null) {\n transactionActions.push(\n initializeTransactionDetailLocalData({\n transactionId,\n vendorId: existingTransaction.vendorId,\n })\n );\n }\n }\n\n const query = {transaction_type: transactionId.type};\n const getTransactionDetail$ = zeniAPI\n .getJSON<TransactionDetailResponse>(\n `${\n zeniAPI.apiEndPoints.accountMicroServiceBaseUrl\n }/1.0/transactions/${transactionId.id}?query=${encodeURIComponent(\n JSON.stringify(query)\n )}`\n )\n .pipe(\n mergeMap((response) => {\n if (\n isSuccessResponse(response) &&\n response.data?.transaction?.transaction_id != null\n ) {\n const updateActions: ActionType[] = [];\n const transcationId = toTransactionID(\n response.data.transaction\n );\n\n const responseData = {\n ...response.data,\n vendors:\n response.data.vendors?.map((vendor) => ({\n ...vendor,\n vendor_id: vendor.qbo_id ?? vendor.vendor_id,\n })) ?? [],\n };\n\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateVendors(responseData.vendors, 'merge')\n );\n }\n // Use the full zeni ID (transcationId.id) as the entity store key\n // so it matches how all list-fetch epics save transactions, avoiding\n // duplicate entries under different key formats.\n updateActions.push(\n updateTransaction(\n transcationId.id,\n responseData.transaction\n )\n );\n updateActions.push(\n initializeTransactionDetailLocalData({\n transactionId: transcationId,\n vendorId: responseData.vendors[0]?.vendor_id,\n })\n );\n updateActions.push(\n updateTransactionDetailFetchState(transcationId, 'Completed')\n );\n // IMPORTANT: Fetch linked transactions..\n updateActions.push(\n ...getAllFetchLinkedTransactionDetailActions(\n responseData.transaction,\n state$.value\n )\n );\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateTransactionVendorLocalData({\n vendorId: responseData.vendors[0].vendor_id,\n localData: getInitializedTransactionVendorLocalData(\n mapVendorPayloadToVendor(responseData.vendors[0])\n ),\n })\n );\n }\n // If vendor transaction, fetch owners list\n if (\n toVendorTransactionTypeStrict(\n responseData.transaction.transaction_type\n ) != null\n ) {\n updateActions.push(fetchOwnerList());\n }\n return from(updateActions);\n } else {\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) => {\n console.error(`REST API call errored out ${error}`);\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n );\n })\n );\n\n return concat(from(transactionActions), getTransactionDetail$);\n } else {\n return from(transactionActions);\n }\n })\n );\n\n/**\n * Helper functions\n */\n\nfunction removeCompleteTransaction(\n transactionId: TransactionID,\n transaction: Transaction | undefined\n): ActionType[] {\n const actions: ActionType[] = [];\n actions.push(removeTransactionDetail(transactionId));\n if (transaction != null) {\n actions.push(removeTransaction(getTransactionDetailKey(transactionId)));\n // remove all the linked transactions too..\n const linkedTransactions = getAllLinkedTransactions(transaction);\n linkedTransactions.forEach((linkedTransaction) => {\n actions.push(removeTransactionDetail(linkedTransaction));\n actions.push(\n removeTransaction(getTransactionDetailKey(linkedTransaction))\n );\n });\n }\n\n return actions;\n}\n\nfunction isTransactionDetailInCacheOrFetching(\n transactionId: TransactionID,\n state: RootState\n): boolean {\n const detailKey = getTransactionDetailKey(transactionId);\n const detail = state.transactionDetailState.transactionDetailById[detailKey];\n\n return (\n detail != null &&\n (detail.hasValidState() === true || detail.fetchState === 'In-Progress')\n );\n}\n\nfunction getAllFetchLinkedTransactionDetailActions(\n transactionPayload: TransactionPayload,\n state: RootState\n): ReturnType<typeof fetchTransactionDetail>[] {\n const fetchLinkedTransactionActions: ReturnType<\n typeof fetchTransactionDetail\n >[] = [];\n\n const currentTransaction = toTransaction(transactionPayload);\n const linkedTransaction = getAllLinkedTransactions(currentTransaction);\n\n const linkedTransactionFiltered = linkedTransaction.filter(\n (value) => isTransactionDetailInCacheOrFetching(value, state) === false\n );\n\n linkedTransactionFiltered.forEach((transactionDetailToFetch) =>\n fetchLinkedTransactionActions.push(\n fetchTransactionDetail(transactionDetailToFetch, false)\n )\n );\n if (linkedTransactionFiltered.length === 0) {\n console.log(\n 'Phew all linked transactions are fetched or there are no linked transactions..'\n );\n }\n return fetchLinkedTransactionActions;\n}\n"]}
1
+ {"version":3,"file":"transactionDetailEpic.js","sourceRoot":"","sources":["../../../../../src/view/transactionDetail/epics/transactionDetailEpic.ts"],"names":[],"mappings":"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","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {Observable, concat, from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {\n TransactionPayload,\n toTransaction,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n Transaction,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {toVendorTransactionTypeStrict} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n removeTransaction,\n updateTransaction,\n} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {mapVendorPayloadToVendor} from '../../../entity/vendor/vendorPayload';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {RootState} from '../../../reducer';\nimport {createZeniAPIStatus, isSuccessResponse} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {fetchAccountList} from '../../accountList/accountListReducer';\nimport {fetchClassList} from '../../classList/classListReducer';\nimport {getInitializedTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorLocalDataHelper';\nimport {updateTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorViewReducer';\nimport {fetchOwnerList} from '../../ownerList/ownerListReducer';\nimport {updateSortUiState} from '../../vendorList/vendorListReducer';\nimport {TransactionDetailResponse} from '../transactionDetailPayload';\nimport {\n fetchTransactionDetail,\n initializeTransactionDetailLocalData,\n removeTransactionDetail,\n updateTransactionDetailFetchState,\n} from '../transactionDetailReducer';\nimport {\n getAllLinkedTransactions,\n getTransactionDetailKey,\n} from '../transactionDetailState';\n\nexport type ActionType =\n | ReturnType<typeof fetchTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactionDetailFetchState>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof removeTransaction>\n | ReturnType<typeof removeTransactionDetail>\n | ReturnType<typeof fetchClassList>\n | ReturnType<typeof fetchAccountList>\n | ReturnType<typeof updateSortUiState>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof updateTransactionVendorLocalData>\n | ReturnType<typeof fetchOwnerList>;\n\nexport const fetchTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n): Observable<ActionType> =>\n actions$.pipe(\n filter(fetchTransactionDetail.match),\n mergeMap((action) => {\n const {transactionId, cacheOverride} = action.payload;\n const detailKey = getTransactionDetailKey(transactionId);\n const transactionActions: ActionType[] = [];\n\n if (cacheOverride === true) {\n const transaction = getSupportedTransactionById(\n state$.value.transactionState,\n transactionId.id\n );\n transactionActions.push(\n ...removeCompleteTransaction(transactionId, transaction)\n );\n }\n\n const transactionDetail = recordGet(\n state$.value.transactionDetailState.transactionDetailById,\n detailKey,\n undefined\n );\n\n if (\n cacheOverride === true ||\n transactionDetail == null ||\n (transactionDetail.hasValidState() === false &&\n transactionDetail.fetchState !== 'In-Progress')\n ) {\n const accountList =\n state$.value.accountListState.byReportId.accountList;\n if (\n accountList.hasValidState() === false &&\n accountList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchAccountList('accountList'));\n }\n const classList = state$.value.classListState;\n if (\n classList.hasValidState() === false &&\n classList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchClassList());\n }\n\n transactionActions.push(\n updateTransactionDetailFetchState(transactionId, 'In-Progress')\n );\n\n // If the transaction already exists in the entity store (e.g. fetched by the\n // list page), initialize local data immediately so the UI can render whatever\n // data is available while the full detail fetch completes in parallel.\n //\n // The entity store canonical key is the full zeni ID (transactionId.id),\n // which is the same key used by all list-fetch epics.\n //\n // DEPENDENCY: The web-components TransactionDetailPage sets effectiveIsDisabled\n // to \"disabled\" while fetchState !== \"Completed\". This prevents any user edits\n // between this early init and the second init dispatched on API response (below).\n // If that guard is ever removed, user edits made against partial list data will\n // be silently overwritten when the full detail response arrives.\n if (cacheOverride !== true) {\n const existingTransaction = getSupportedTransactionById(\n state$.value.transactionState,\n transactionId.id\n );\n if (existingTransaction != null) {\n transactionActions.push(\n initializeTransactionDetailLocalData({\n transactionId,\n vendorId: existingTransaction.vendorId,\n })\n );\n }\n }\n\n const query = {transaction_type: transactionId.type};\n const getTransactionDetail$ = zeniAPI\n .getJSON<TransactionDetailResponse>(\n `${\n zeniAPI.apiEndPoints.accountMicroServiceBaseUrl\n }/1.0/transactions/${transactionId.id}?query=${encodeURIComponent(\n JSON.stringify(query)\n )}`\n )\n .pipe(\n mergeMap((response) => {\n if (\n isSuccessResponse(response) &&\n response.data?.transaction?.transaction_id != null\n ) {\n const updateActions: ActionType[] = [];\n const responseTransactionId = toTransactionID(\n response.data.transaction\n );\n\n const responseData = {\n ...response.data,\n vendors:\n response.data.vendors?.map((vendor) => ({\n ...vendor,\n vendor_id: vendor.qbo_id ?? vendor.vendor_id,\n })) ?? [],\n };\n\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateVendors(responseData.vendors, 'merge')\n );\n }\n // Use the full zeni ID as the entity store key so it matches\n // how all list-fetch epics save transactions, avoiding\n // duplicate entries under different key formats.\n updateActions.push(\n updateTransaction(\n responseTransactionId.id,\n responseData.transaction\n )\n );\n updateActions.push(\n initializeTransactionDetailLocalData({\n transactionId: responseTransactionId,\n vendorId: responseData.vendors[0]?.vendor_id,\n })\n );\n updateActions.push(\n updateTransactionDetailFetchState(responseTransactionId, 'Completed')\n );\n // IMPORTANT: Fetch linked transactions..\n updateActions.push(\n ...getAllFetchLinkedTransactionDetailActions(\n responseData.transaction,\n state$.value\n )\n );\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateTransactionVendorLocalData({\n vendorId: responseData.vendors[0].vendor_id,\n localData: getInitializedTransactionVendorLocalData(\n mapVendorPayloadToVendor(responseData.vendors[0])\n ),\n })\n );\n }\n // If vendor transaction, fetch owners list\n if (\n toVendorTransactionTypeStrict(\n responseData.transaction.transaction_type\n ) != null\n ) {\n updateActions.push(fetchOwnerList());\n }\n return from(updateActions);\n } else {\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) => {\n console.error(`REST API call errored out ${error}`);\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n );\n })\n );\n\n return concat(from(transactionActions), getTransactionDetail$);\n } else {\n return from(transactionActions);\n }\n })\n );\n\n/**\n * Helper functions\n */\n\nfunction removeCompleteTransaction(\n transactionId: TransactionID,\n transaction: Transaction | undefined\n): ActionType[] {\n const actions: ActionType[] = [];\n actions.push(removeTransactionDetail(transactionId));\n if (transaction != null) {\n // Use transactionId.id (full zeni ID) — the canonical entity store key.\n // getTransactionDetailKey produces a different composite key used only by\n // transactionDetailState, not the entity store.\n actions.push(removeTransaction(transactionId.id));\n // remove all the linked transactions too..\n const linkedTransactions = getAllLinkedTransactions(transaction);\n linkedTransactions.forEach((linkedTransaction) => {\n actions.push(removeTransactionDetail(linkedTransaction));\n actions.push(removeTransaction(linkedTransaction.id));\n });\n }\n\n return actions;\n}\n\nfunction isTransactionDetailInCacheOrFetching(\n transactionId: TransactionID,\n state: RootState\n): boolean {\n const detailKey = getTransactionDetailKey(transactionId);\n const detail = state.transactionDetailState.transactionDetailById[detailKey];\n\n return (\n detail != null &&\n (detail.hasValidState() === true || detail.fetchState === 'In-Progress')\n );\n}\n\nfunction getAllFetchLinkedTransactionDetailActions(\n transactionPayload: TransactionPayload,\n state: RootState\n): ReturnType<typeof fetchTransactionDetail>[] {\n const fetchLinkedTransactionActions: ReturnType<\n typeof fetchTransactionDetail\n >[] = [];\n\n const currentTransaction = toTransaction(transactionPayload);\n const linkedTransaction = getAllLinkedTransactions(currentTransaction);\n\n const linkedTransactionFiltered = linkedTransaction.filter(\n (value) => isTransactionDetailInCacheOrFetching(value, state) === false\n );\n\n linkedTransactionFiltered.forEach((transactionDetailToFetch) =>\n fetchLinkedTransactionActions.push(\n fetchTransactionDetail(transactionDetailToFetch, false)\n )\n );\n if (linkedTransactionFiltered.length === 0) {\n console.log(\n 'Phew all linked transactions are fetched or there are no linked transactions..'\n );\n }\n return fetchLinkedTransactionActions;\n}\n"]}
@@ -14,7 +14,7 @@ import { toJEAndDepositTransactionTypeStrict, toVendorTransactionTypeStrict, } f
14
14
  import { isVendorTransaction, } from '../../../entity/transaction/stateTypes/vendorTransaction';
15
15
  import toSupportedTransaction from '../../../entity/transaction/toSupportedTransaction';
16
16
  import { getTransactionWithCOT } from '../../../entity/transaction/transactionHelper';
17
- import { updateTransaction, } from '../../../entity/transaction/transactionReducer';
17
+ import { updateTransaction } from '../../../entity/transaction/transactionReducer';
18
18
  import { getSupportedTransactionById } from '../../../entity/transaction/transactionSelector';
19
19
  import { updateVendors } from '../../../entity/vendor/vendorReducer';
20
20
  import { getVendorByVendorId } from '../../../entity/vendor/vendorSelector';
@@ -106,9 +106,12 @@ export const updateTransactionDetailEpic = (actions$, state$, zeniAPI) => action
106
106
  }));
107
107
  }
108
108
  }
109
- // Note: no separate updateTransactions needed — updateTransaction above
110
- // already writes under transactionIdResp.id (the full zeni ID), which is
111
- // the same key used by all list-fetch epics.
109
+ // No separate updateTransactions call needed: updateTransaction above
110
+ // writes under transactionIdResp.id (the full zeni ID). This is the same
111
+ // key all list-fetch epics use, so list selectors will read fresh data.
112
+ // ASSUMPTION: toTransactionID(response).id === the transaction_id value
113
+ // that list-fetch epics pass to updateTransactions. If these ever diverge,
114
+ // list rows will go stale after a detail save.
112
115
  const transactionWithCOT = getTransactionWithCOT(transaction);
113
116
  const pendingReviewLineIds = getPendingReviewLineIdsFromTransaction(transactionWithCOT);
114
117
  actions.push(syncTransactionCategorizationFromDetailSave(transactionIdResp, transactionWithCOT, pendingReviewLineIds, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled));
@@ -1 +1 @@
1
- {"version":3,"file":"updateTransactionDetailEpic.js","sourceRoot":"","sources":["../../../../../src/view/transactionDetail/epics/updateTransactionDetailEpic.ts"],"names":[],"mappings":"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","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toRecommendationPayload} from '../../../commonPayloadTypes/recommendationPayload';\nimport {COTTransactionTracking} from '../../../commonStateTypes/recommendationBase';\nimport {CustomerBase} from '../../../entity/customer/customerState';\nimport {Entity} from '../../../entity/genericEntity/entity';\nimport {openSnackbar} from '../../../entity/snackbar/snackbarReducer';\nimport {toCustomerTransactionPayload} from '../../../entity/transaction/payloadTypes/customerTransactionPayload';\nimport {toTransferTransactionPayload} from '../../../entity/transaction/payloadTypes/otherTransactionPayload';\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {TransactionWithAccountAndClassLinePayload} from '../../../entity/transaction/payloadTypes/transactionLinePayload';\nimport {\n TransactionPayload,\n injectCOTFlagsIntoTransactionPayload,\n toTransactionPayload,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n toVendorTransactionPayload,\n toVendorTransactionWithCustomerPayload,\n} from '../../../entity/transaction/payloadTypes/vendorTransactionPayload';\nimport {\n CustomerTransaction,\n isCustomerTransaction,\n} from '../../../entity/transaction/stateTypes/customerTransaction';\nimport {\n TransferTransaction,\n isTransferTransaction,\n} from '../../../entity/transaction/stateTypes/otherTransaction';\nimport {\n RecommendationByLineId,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {\n LineWithCOTTracking,\n TransactionWithAccountAndClassLineWithCOTTracking,\n} from '../../../entity/transaction/stateTypes/transactionLine';\nimport {\n toJEAndDepositTransactionTypeStrict,\n toVendorTransactionTypeStrict,\n} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n VendorTransaction,\n VendorTransactionWithCustomer,\n isVendorTransaction,\n} from '../../../entity/transaction/stateTypes/vendorTransaction';\nimport toSupportedTransaction from '../../../entity/transaction/toSupportedTransaction';\nimport {getTransactionWithCOT} from '../../../entity/transaction/transactionHelper';\nimport {\n updateTransaction,\n updateTransactions,\n} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {\n SupportedTransaction,\n SupportedTransactionPayload,\n TransactionState,\n} from '../../../entity/transaction/transactionState';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {getVendorByVendorId} from '../../../entity/vendor/vendorSelector';\nimport {VendorBase, VendorState} from '../../../entity/vendor/vendorState';\nimport {RootState} from '../../../reducer';\nimport {\n createZeniAPIStatus,\n isActionNotAllowed,\n isSuccessResponse,\n} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {getPendingReviewLineIdsFromTransaction} from '../../expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';\nimport {syncTransactionCategorizationFromDetailSave} from '../../expenseAutomationView/reducers/transactionsViewReducer';\nimport {EntityRecommendationKey} from '../../recommendation/recommendationState';\nimport {\n EntityRelatedUpdatesPayload,\n TransactionDetailUpdateResponse,\n UpdateTransactionDetailPayload,\n} from '../transactionDetailPayload';\nimport {\n initializeTransactionDetailLocalData,\n markTransactionAsNotMiscategorized,\n updateStatusConsolidatedSaveTransactionDetail,\n updateTransactionDetail,\n updateTransactionDetailSaveStatus,\n updateTransactionStateIfUpdateActionNotAllowed,\n} from '../transactionDetailReducer';\nimport {\n EntityRelatedRecommendationUpdates,\n TransactionDetailState,\n TransactionSaveUpdates,\n TransactionUpdates,\n getTransactionDetailKey,\n} from '../transactionDetailState';\nimport {isTransactionUncategorized} from './saveTransactionHelper';\n\nexport type ActionType =\n | ReturnType<typeof updateTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactions>\n | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed>\n | ReturnType<typeof openSnackbar>\n | ReturnType<typeof updateTransactionDetailSaveStatus>\n | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof markTransactionAsNotMiscategorized>\n | ReturnType<typeof syncTransactionCategorizationFromDetailSave>;\n\nexport const updateTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n) =>\n actions$.pipe(\n filter(updateTransactionDetail.match),\n mergeMap((action) => {\n const {transactionState, vendorState, transactionDetailState} =\n state$.value;\n const {\n cotTransactionTracking,\n transactionId,\n transactionSaveUpdates,\n isUncategorizedExpenseCategoryEnabled,\n } = action.payload;\n return zeniAPI\n .putAndGetJSON<TransactionDetailUpdateResponse>(\n `${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${action.payload.transactionId.id}/categorize`,\n preparePayload(\n transactionState,\n vendorState,\n transactionDetailState,\n transactionId,\n transactionSaveUpdates,\n cotTransactionTracking\n )\n )\n .pipe(\n mergeMap((response) => {\n if (isSuccessResponse(response) && response.data != null) {\n const transactionIdResp = toTransactionID(\n response.data.transaction\n );\n const transactionDetailKeyForResponse =\n getTransactionDetailKey(transactionIdResp);\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKeyForResponse, // detail key is correct for transactionDetailState\n undefined\n );\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n let vendorUpdates: VendorBase | undefined = undefined;\n if (tranVendorUpdates?.qboId != null) {\n const vendor = getVendorByVendorId(\n vendorState,\n tranVendorUpdates.qboId\n );\n if (vendor != null) {\n vendorUpdates = {\n id: vendor?.qboId,\n name: vendor?.name,\n };\n } else if (tranVendorUpdates.name != null) {\n vendorUpdates = {\n id: tranVendorUpdates.qboId,\n name: tranVendorUpdates.name,\n };\n }\n }\n const actions: ActionType[] = [];\n if (response.data.vendors != null) {\n actions.push(updateVendors(response.data.vendors, 'merge'));\n }\n actions.push(\n updateTransaction(\n transactionIdResp.id,\n response.data.transaction\n )\n );\n actions.push(\n initializeTransactionDetailLocalData({\n transactionId: transactionIdResp,\n vendorId: response.data.vendors?.[0]?.vendor_id,\n })\n );\n actions.push(\n updateTransactionDetailSaveStatus(\n transactionIdResp,\n 'Completed'\n )\n );\n let callMarkTransactionAsNotMiscategorized = true;\n // NOTE: If tran is vendorType OR JE OR Deposit transaction and there is no vendor chosen on this tranaction while saving,\n // then we need to skip mark-miscategorized-as-correct api call\n if (\n toVendorTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null ||\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null\n ) {\n const isAnyClassMissing = checkIfClassMissingForAnyLineItem(\n response.data.transaction\n );\n const isVendorOrCustomerMissingInAnyLine =\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null &&\n checkIfVendorOrCustomerMissingForAnyLineItem(\n response.data.transaction\n );\n if (\n (vendorUpdates?.id == null &&\n isVendorOrCustomerMissingInAnyLine == true) ||\n isAnyClassMissing == true\n ) {\n callMarkTransactionAsNotMiscategorized = false;\n }\n }\n\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n\n const transaction = toSupportedTransaction(\n response.data.transaction\n );\n\n const isTransactionUnCategorized = isTransactionUncategorized(\n transaction,\n uncategorizedIncomeExpense\n );\n\n if (\n action.payload.transactionSaveUpdates.markAsMiscatUpdates ===\n true &&\n callMarkTransactionAsNotMiscategorized === true &&\n isTransactionUnCategorized === false\n ) {\n actions.push(\n markTransactionAsNotMiscategorized(\n transactionIdResp,\n action.payload.transactionSaveUpdates,\n action.payload.isExpenseAutomationEnabled\n )\n );\n } else {\n actions.push(\n updateStatusConsolidatedSaveTransactionDetail({\n transactionId: action.payload.transactionId,\n fetchState: 'Completed',\n })\n );\n if (\n action.payload.transactionSaveUpdates.anyBulkUpdates === true\n ) {\n actions.push(\n openSnackbar({\n messageSection:\n 'transactionDetails_updatingPastTransactions',\n messageText: 'success',\n type: 'success',\n })\n );\n } else {\n actions.push(\n openSnackbar({\n messageSection: 'transactionDetails_transactionUpdated',\n messageText: 'success',\n type: 'success',\n })\n );\n }\n }\n\n // Note: no separate updateTransactions needed — updateTransaction above\n // already writes under transactionIdResp.id (the full zeni ID), which is\n // the same key used by all list-fetch epics.\n const transactionWithCOT = getTransactionWithCOT(transaction);\n const pendingReviewLineIds =\n getPendingReviewLineIdsFromTransaction(transactionWithCOT);\n actions.push(\n syncTransactionCategorizationFromDetailSave(\n transactionIdResp,\n transactionWithCOT,\n pendingReviewLineIds,\n uncategorizedIncomeExpense,\n isUncategorizedExpenseCategoryEnabled\n )\n );\n\n return from(actions);\n } else if (isActionNotAllowed(response)) {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n ),\n updateTransactionStateIfUpdateActionNotAllowed({\n transactionId: action.payload.transactionId,\n })\n );\n } else {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) =>\n of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n )\n )\n );\n })\n );\n\nfunction preparePayload(\n transactionState: TransactionState,\n vendorState: VendorState,\n transactionDetailState: TransactionDetailState,\n transactionId: TransactionID,\n saveUpdates: TransactionSaveUpdates,\n cotTransactionTracking: COTTransactionTracking\n): Partial<UpdateTransactionDetailPayload> | undefined {\n const transactionDetailKey = getTransactionDetailKey(transactionId);\n const detail = getSupportedTransactionById(\n transactionState,\n transactionId.id // entity store uses full zeni ID as canonical key\n );\n\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKey,\n undefined\n );\n\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n const tranCustomerUpdates =\n tranDetail?.transactionDetailLocalData.customerUpdates;\n const currentSelectedEntity =\n tranDetail?.transactionDetailLocalData.selectedEntity;\n\n let vendorUpdates: VendorBase | undefined = undefined;\n\n if (\n tranVendorUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'vendor'\n ) {\n const vendor = getVendorByVendorId(vendorState, tranVendorUpdates.qboId);\n const vendorSource = vendor ?? tranVendorUpdates;\n if (vendorSource != null) {\n vendorUpdates = {\n id:\n vendorSource.qboId === vendorSource.name\n ? ''\n : (vendorSource.qboId ?? ''),\n name: vendorSource.name,\n };\n }\n }\n let customerUpdates: CustomerBase | undefined = undefined;\n\n if (\n tranCustomerUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'customer'\n ) {\n customerUpdates = {\n id: tranCustomerUpdates.qboId,\n name: tranCustomerUpdates.name,\n };\n }\n\n if (detail != null) {\n const transUpdates = toTransactionUpdatePayload(\n saveUpdates.updates,\n detail,\n cotTransactionTracking,\n vendorUpdates,\n customerUpdates,\n currentSelectedEntity\n );\n const entityUpdates = toEntityUpdatePayload(\n saveUpdates.entityRelatedUpdates\n );\n return {\n entity_related_updates: entityUpdates,\n transaction_id: transactionId.id,\n transaction: transUpdates,\n };\n }\n return undefined;\n}\n\nconst toTransactionUpdatePayload = (\n updates: TransactionUpdates,\n detail: SupportedTransaction,\n cotTransactionTracking: COTTransactionTracking,\n vendorUpdates?: VendorBase,\n customerUpdates?: CustomerBase,\n tranSelectedEntity?: Entity\n): Partial<TransactionPayload> => {\n const transaction = Object.assign({}, detail);\n transaction.memo = updates.memo ?? '';\n const recommendationUpdates: RecommendationByLineId = {};\n for (const key in updates.updatesByLineId) {\n const lineUpdates = updates.updatesByLineId[key];\n const newLineMap: LineWithCOTTracking[] | undefined =\n transaction.lines?.map((line) => {\n if (line.id === key) {\n const lineTobeUpdated = Object.assign(\n {},\n line\n ) as TransactionWithAccountAndClassLineWithCOTTracking;\n lineTobeUpdated.lineDescription = lineUpdates.lineDescription ?? '';\n if (lineUpdates.class != null) {\n lineTobeUpdated.class = lineUpdates.class;\n }\n if (lineUpdates.account != null) {\n lineTobeUpdated.account = lineUpdates.account;\n }\n\n if (lineUpdates.customer != null) {\n lineTobeUpdated.customer = lineUpdates.customer;\n } else {\n lineTobeUpdated.customer = undefined;\n }\n if (lineUpdates.vendor != null) {\n lineTobeUpdated.vendor = lineUpdates.vendor;\n } else {\n lineTobeUpdated.vendor = undefined;\n }\n\n if (lineUpdates.recommendation != null) {\n recommendationUpdates[line.id] = lineUpdates.recommendation;\n }\n\n // Add COT viewing flags to the line from cotTransactionTracking\n const cotTrackingForLine = cotTransactionTracking?.find(\n (item) => item.lineId === line.id\n );\n\n if (cotTrackingForLine) {\n lineTobeUpdated.cotViewingFlags = {\n vendor: cotTrackingForLine.vendor,\n category: cotTrackingForLine.category,\n class: cotTrackingForLine.class,\n lineId: cotTrackingForLine.lineId,\n };\n }\n\n return lineTobeUpdated;\n }\n return line;\n });\n transaction.lines = newLineMap;\n }\n transaction.recommendations = recommendationUpdates;\n\n // Convert transaction to payload first\n let basePayload: Partial<TransactionPayload>;\n if (isCustomerTransaction(transaction)) {\n basePayload = toCustomerTransactionPayload(\n transaction as CustomerTransaction\n );\n } else if (isVendorTransaction(transaction)) {\n if (tranSelectedEntity != null && tranSelectedEntity.type === 'customer') {\n basePayload = toVendorTransactionWithCustomerPayload(\n transaction as VendorTransactionWithCustomer,\n customerUpdates\n );\n } else {\n basePayload = toVendorTransactionPayload(\n transaction as VendorTransaction,\n vendorUpdates\n );\n }\n } else if (isTransferTransaction(transaction)) {\n basePayload = toTransferTransactionPayload(\n transaction as TransferTransaction\n );\n } else {\n basePayload = toTransactionPayload(transaction);\n }\n\n // Inject COT flags into the payload\n return injectCOTFlagsIntoTransactionPayload(basePayload, transaction);\n};\n\nconst checkIfClassMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyClassMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail?.class\n ?.accounting_class_id == null\n ) {\n isAnyClassMissing = true;\n }\n });\n }\n return isAnyClassMissing;\n};\n\nconst checkIfVendorOrCustomerMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyVendorOrCustomerMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.vendor == null &&\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.customer == null\n ) {\n isAnyVendorOrCustomerMissing = true;\n }\n });\n }\n return isAnyVendorOrCustomerMissing;\n};\n\nconst toEntityUpdatePayload = (\n entityUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >\n) => {\n const entityUpdatesPayload: EntityRelatedUpdatesPayload[] = [];\n\n let entityKey: EntityRecommendationKey;\n for (entityKey in entityUpdates) {\n const entityUpdate = entityUpdates[entityKey];\n const entityUpdatePayload: EntityRelatedUpdatesPayload = {\n recommendations: toRecommendationPayload(entityUpdate.recommendations),\n entity_id: entityUpdate.entityId,\n entity_type: entityUpdate.entityType,\n is_bulk_update: entityUpdate.isBulkUpdate,\n updated_entity_id: entityUpdate.updatedEntityId,\n };\n\n // Add vendor_name if it's a vendor entity and name is provided\n if (\n entityUpdate.entityType === 'vendor' &&\n entityUpdate.vendorName != null\n ) {\n entityUpdatePayload.vendor_name = entityUpdate.vendorName;\n }\n entityUpdatesPayload.push(entityUpdatePayload);\n }\n return entityUpdatesPayload;\n};\n"]}
1
+ {"version":3,"file":"updateTransactionDetailEpic.js","sourceRoot":"","sources":["../../../../../src/view/transactionDetail/epics/updateTransactionDetailEpic.ts"],"names":[],"mappings":"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","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toRecommendationPayload} from '../../../commonPayloadTypes/recommendationPayload';\nimport {COTTransactionTracking} from '../../../commonStateTypes/recommendationBase';\nimport {CustomerBase} from '../../../entity/customer/customerState';\nimport {Entity} from '../../../entity/genericEntity/entity';\nimport {openSnackbar} from '../../../entity/snackbar/snackbarReducer';\nimport {toCustomerTransactionPayload} from '../../../entity/transaction/payloadTypes/customerTransactionPayload';\nimport {toTransferTransactionPayload} from '../../../entity/transaction/payloadTypes/otherTransactionPayload';\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {TransactionWithAccountAndClassLinePayload} from '../../../entity/transaction/payloadTypes/transactionLinePayload';\nimport {\n TransactionPayload,\n injectCOTFlagsIntoTransactionPayload,\n toTransactionPayload,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n toVendorTransactionPayload,\n toVendorTransactionWithCustomerPayload,\n} from '../../../entity/transaction/payloadTypes/vendorTransactionPayload';\nimport {\n CustomerTransaction,\n isCustomerTransaction,\n} from '../../../entity/transaction/stateTypes/customerTransaction';\nimport {\n TransferTransaction,\n isTransferTransaction,\n} from '../../../entity/transaction/stateTypes/otherTransaction';\nimport {\n RecommendationByLineId,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {\n LineWithCOTTracking,\n TransactionWithAccountAndClassLineWithCOTTracking,\n} from '../../../entity/transaction/stateTypes/transactionLine';\nimport {\n toJEAndDepositTransactionTypeStrict,\n toVendorTransactionTypeStrict,\n} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n VendorTransaction,\n VendorTransactionWithCustomer,\n isVendorTransaction,\n} from '../../../entity/transaction/stateTypes/vendorTransaction';\nimport toSupportedTransaction from '../../../entity/transaction/toSupportedTransaction';\nimport {getTransactionWithCOT} from '../../../entity/transaction/transactionHelper';\nimport {updateTransaction} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {\n SupportedTransaction,\n SupportedTransactionPayload,\n TransactionState,\n} from '../../../entity/transaction/transactionState';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {getVendorByVendorId} from '../../../entity/vendor/vendorSelector';\nimport {VendorBase, VendorState} from '../../../entity/vendor/vendorState';\nimport {RootState} from '../../../reducer';\nimport {\n createZeniAPIStatus,\n isActionNotAllowed,\n isSuccessResponse,\n} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {getPendingReviewLineIdsFromTransaction} from '../../expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';\nimport {syncTransactionCategorizationFromDetailSave} from '../../expenseAutomationView/reducers/transactionsViewReducer';\nimport {EntityRecommendationKey} from '../../recommendation/recommendationState';\nimport {\n EntityRelatedUpdatesPayload,\n TransactionDetailUpdateResponse,\n UpdateTransactionDetailPayload,\n} from '../transactionDetailPayload';\nimport {\n initializeTransactionDetailLocalData,\n markTransactionAsNotMiscategorized,\n updateStatusConsolidatedSaveTransactionDetail,\n updateTransactionDetail,\n updateTransactionDetailSaveStatus,\n updateTransactionStateIfUpdateActionNotAllowed,\n} from '../transactionDetailReducer';\nimport {\n EntityRelatedRecommendationUpdates,\n TransactionDetailState,\n TransactionSaveUpdates,\n TransactionUpdates,\n getTransactionDetailKey,\n} from '../transactionDetailState';\nimport {isTransactionUncategorized} from './saveTransactionHelper';\n\nexport type ActionType =\n | ReturnType<typeof updateTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed>\n | ReturnType<typeof openSnackbar>\n | ReturnType<typeof updateTransactionDetailSaveStatus>\n | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof markTransactionAsNotMiscategorized>\n | ReturnType<typeof syncTransactionCategorizationFromDetailSave>;\n\nexport const updateTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n) =>\n actions$.pipe(\n filter(updateTransactionDetail.match),\n mergeMap((action) => {\n const {transactionState, vendorState, transactionDetailState} =\n state$.value;\n const {\n cotTransactionTracking,\n transactionId,\n transactionSaveUpdates,\n isUncategorizedExpenseCategoryEnabled,\n } = action.payload;\n return zeniAPI\n .putAndGetJSON<TransactionDetailUpdateResponse>(\n `${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${action.payload.transactionId.id}/categorize`,\n preparePayload(\n transactionState,\n vendorState,\n transactionDetailState,\n transactionId,\n transactionSaveUpdates,\n cotTransactionTracking\n )\n )\n .pipe(\n mergeMap((response) => {\n if (isSuccessResponse(response) && response.data != null) {\n const transactionIdResp = toTransactionID(\n response.data.transaction\n );\n const transactionDetailKeyForResponse =\n getTransactionDetailKey(transactionIdResp);\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKeyForResponse, // detail key is correct for transactionDetailState\n undefined\n );\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n let vendorUpdates: VendorBase | undefined = undefined;\n if (tranVendorUpdates?.qboId != null) {\n const vendor = getVendorByVendorId(\n vendorState,\n tranVendorUpdates.qboId\n );\n if (vendor != null) {\n vendorUpdates = {\n id: vendor?.qboId,\n name: vendor?.name,\n };\n } else if (tranVendorUpdates.name != null) {\n vendorUpdates = {\n id: tranVendorUpdates.qboId,\n name: tranVendorUpdates.name,\n };\n }\n }\n const actions: ActionType[] = [];\n if (response.data.vendors != null) {\n actions.push(updateVendors(response.data.vendors, 'merge'));\n }\n actions.push(\n updateTransaction(\n transactionIdResp.id,\n response.data.transaction\n )\n );\n actions.push(\n initializeTransactionDetailLocalData({\n transactionId: transactionIdResp,\n vendorId: response.data.vendors?.[0]?.vendor_id,\n })\n );\n actions.push(\n updateTransactionDetailSaveStatus(\n transactionIdResp,\n 'Completed'\n )\n );\n let callMarkTransactionAsNotMiscategorized = true;\n // NOTE: If tran is vendorType OR JE OR Deposit transaction and there is no vendor chosen on this tranaction while saving,\n // then we need to skip mark-miscategorized-as-correct api call\n if (\n toVendorTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null ||\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null\n ) {\n const isAnyClassMissing = checkIfClassMissingForAnyLineItem(\n response.data.transaction\n );\n const isVendorOrCustomerMissingInAnyLine =\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null &&\n checkIfVendorOrCustomerMissingForAnyLineItem(\n response.data.transaction\n );\n if (\n (vendorUpdates?.id == null &&\n isVendorOrCustomerMissingInAnyLine == true) ||\n isAnyClassMissing == true\n ) {\n callMarkTransactionAsNotMiscategorized = false;\n }\n }\n\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n\n const transaction = toSupportedTransaction(\n response.data.transaction\n );\n\n const isTransactionUnCategorized = isTransactionUncategorized(\n transaction,\n uncategorizedIncomeExpense\n );\n\n if (\n action.payload.transactionSaveUpdates.markAsMiscatUpdates ===\n true &&\n callMarkTransactionAsNotMiscategorized === true &&\n isTransactionUnCategorized === false\n ) {\n actions.push(\n markTransactionAsNotMiscategorized(\n transactionIdResp,\n action.payload.transactionSaveUpdates,\n action.payload.isExpenseAutomationEnabled\n )\n );\n } else {\n actions.push(\n updateStatusConsolidatedSaveTransactionDetail({\n transactionId: action.payload.transactionId,\n fetchState: 'Completed',\n })\n );\n if (\n action.payload.transactionSaveUpdates.anyBulkUpdates === true\n ) {\n actions.push(\n openSnackbar({\n messageSection:\n 'transactionDetails_updatingPastTransactions',\n messageText: 'success',\n type: 'success',\n })\n );\n } else {\n actions.push(\n openSnackbar({\n messageSection: 'transactionDetails_transactionUpdated',\n messageText: 'success',\n type: 'success',\n })\n );\n }\n }\n\n // No separate updateTransactions call needed: updateTransaction above\n // writes under transactionIdResp.id (the full zeni ID). This is the same\n // key all list-fetch epics use, so list selectors will read fresh data.\n // ASSUMPTION: toTransactionID(response).id === the transaction_id value\n // that list-fetch epics pass to updateTransactions. If these ever diverge,\n // list rows will go stale after a detail save.\n const transactionWithCOT = getTransactionWithCOT(transaction);\n const pendingReviewLineIds =\n getPendingReviewLineIdsFromTransaction(transactionWithCOT);\n actions.push(\n syncTransactionCategorizationFromDetailSave(\n transactionIdResp,\n transactionWithCOT,\n pendingReviewLineIds,\n uncategorizedIncomeExpense,\n isUncategorizedExpenseCategoryEnabled\n )\n );\n\n return from(actions);\n } else if (isActionNotAllowed(response)) {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n ),\n updateTransactionStateIfUpdateActionNotAllowed({\n transactionId: action.payload.transactionId,\n })\n );\n } else {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) =>\n of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n )\n )\n );\n })\n );\n\nfunction preparePayload(\n transactionState: TransactionState,\n vendorState: VendorState,\n transactionDetailState: TransactionDetailState,\n transactionId: TransactionID,\n saveUpdates: TransactionSaveUpdates,\n cotTransactionTracking: COTTransactionTracking\n): Partial<UpdateTransactionDetailPayload> | undefined {\n const transactionDetailKey = getTransactionDetailKey(transactionId);\n const detail = getSupportedTransactionById(\n transactionState,\n transactionId.id // entity store uses full zeni ID as canonical key\n );\n\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKey,\n undefined\n );\n\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n const tranCustomerUpdates =\n tranDetail?.transactionDetailLocalData.customerUpdates;\n const currentSelectedEntity =\n tranDetail?.transactionDetailLocalData.selectedEntity;\n\n let vendorUpdates: VendorBase | undefined = undefined;\n\n if (\n tranVendorUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'vendor'\n ) {\n const vendor = getVendorByVendorId(vendorState, tranVendorUpdates.qboId);\n const vendorSource = vendor ?? tranVendorUpdates;\n if (vendorSource != null) {\n vendorUpdates = {\n id:\n vendorSource.qboId === vendorSource.name\n ? ''\n : (vendorSource.qboId ?? ''),\n name: vendorSource.name,\n };\n }\n }\n let customerUpdates: CustomerBase | undefined = undefined;\n\n if (\n tranCustomerUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'customer'\n ) {\n customerUpdates = {\n id: tranCustomerUpdates.qboId,\n name: tranCustomerUpdates.name,\n };\n }\n\n if (detail != null) {\n const transUpdates = toTransactionUpdatePayload(\n saveUpdates.updates,\n detail,\n cotTransactionTracking,\n vendorUpdates,\n customerUpdates,\n currentSelectedEntity\n );\n const entityUpdates = toEntityUpdatePayload(\n saveUpdates.entityRelatedUpdates\n );\n return {\n entity_related_updates: entityUpdates,\n transaction_id: transactionId.id,\n transaction: transUpdates,\n };\n }\n return undefined;\n}\n\nconst toTransactionUpdatePayload = (\n updates: TransactionUpdates,\n detail: SupportedTransaction,\n cotTransactionTracking: COTTransactionTracking,\n vendorUpdates?: VendorBase,\n customerUpdates?: CustomerBase,\n tranSelectedEntity?: Entity\n): Partial<TransactionPayload> => {\n const transaction = Object.assign({}, detail);\n transaction.memo = updates.memo ?? '';\n const recommendationUpdates: RecommendationByLineId = {};\n for (const key in updates.updatesByLineId) {\n const lineUpdates = updates.updatesByLineId[key];\n const newLineMap: LineWithCOTTracking[] | undefined =\n transaction.lines?.map((line) => {\n if (line.id === key) {\n const lineTobeUpdated = Object.assign(\n {},\n line\n ) as TransactionWithAccountAndClassLineWithCOTTracking;\n lineTobeUpdated.lineDescription = lineUpdates.lineDescription ?? '';\n if (lineUpdates.class != null) {\n lineTobeUpdated.class = lineUpdates.class;\n }\n if (lineUpdates.account != null) {\n lineTobeUpdated.account = lineUpdates.account;\n }\n\n if (lineUpdates.customer != null) {\n lineTobeUpdated.customer = lineUpdates.customer;\n } else {\n lineTobeUpdated.customer = undefined;\n }\n if (lineUpdates.vendor != null) {\n lineTobeUpdated.vendor = lineUpdates.vendor;\n } else {\n lineTobeUpdated.vendor = undefined;\n }\n\n if (lineUpdates.recommendation != null) {\n recommendationUpdates[line.id] = lineUpdates.recommendation;\n }\n\n // Add COT viewing flags to the line from cotTransactionTracking\n const cotTrackingForLine = cotTransactionTracking?.find(\n (item) => item.lineId === line.id\n );\n\n if (cotTrackingForLine) {\n lineTobeUpdated.cotViewingFlags = {\n vendor: cotTrackingForLine.vendor,\n category: cotTrackingForLine.category,\n class: cotTrackingForLine.class,\n lineId: cotTrackingForLine.lineId,\n };\n }\n\n return lineTobeUpdated;\n }\n return line;\n });\n transaction.lines = newLineMap;\n }\n transaction.recommendations = recommendationUpdates;\n\n // Convert transaction to payload first\n let basePayload: Partial<TransactionPayload>;\n if (isCustomerTransaction(transaction)) {\n basePayload = toCustomerTransactionPayload(\n transaction as CustomerTransaction\n );\n } else if (isVendorTransaction(transaction)) {\n if (tranSelectedEntity != null && tranSelectedEntity.type === 'customer') {\n basePayload = toVendorTransactionWithCustomerPayload(\n transaction as VendorTransactionWithCustomer,\n customerUpdates\n );\n } else {\n basePayload = toVendorTransactionPayload(\n transaction as VendorTransaction,\n vendorUpdates\n );\n }\n } else if (isTransferTransaction(transaction)) {\n basePayload = toTransferTransactionPayload(\n transaction as TransferTransaction\n );\n } else {\n basePayload = toTransactionPayload(transaction);\n }\n\n // Inject COT flags into the payload\n return injectCOTFlagsIntoTransactionPayload(basePayload, transaction);\n};\n\nconst checkIfClassMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyClassMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail?.class\n ?.accounting_class_id == null\n ) {\n isAnyClassMissing = true;\n }\n });\n }\n return isAnyClassMissing;\n};\n\nconst checkIfVendorOrCustomerMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyVendorOrCustomerMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.vendor == null &&\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.customer == null\n ) {\n isAnyVendorOrCustomerMissing = true;\n }\n });\n }\n return isAnyVendorOrCustomerMissing;\n};\n\nconst toEntityUpdatePayload = (\n entityUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >\n) => {\n const entityUpdatesPayload: EntityRelatedUpdatesPayload[] = [];\n\n let entityKey: EntityRecommendationKey;\n for (entityKey in entityUpdates) {\n const entityUpdate = entityUpdates[entityKey];\n const entityUpdatePayload: EntityRelatedUpdatesPayload = {\n recommendations: toRecommendationPayload(entityUpdate.recommendations),\n entity_id: entityUpdate.entityId,\n entity_type: entityUpdate.entityType,\n is_bulk_update: entityUpdate.isBulkUpdate,\n updated_entity_id: entityUpdate.updatedEntityId,\n };\n\n // Add vendor_name if it's a vendor entity and name is provided\n if (\n entityUpdate.entityType === 'vendor' &&\n entityUpdate.vendorName != null\n ) {\n entityUpdatePayload.vendor_name = entityUpdate.vendorName;\n }\n entityUpdatesPayload.push(entityUpdatePayload);\n }\n return entityUpdatesPayload;\n};\n"]}
@@ -1,6 +1,18 @@
1
- // This transaction key only extracts the third party ID and uses that
2
- // for the ID
1
+ // TWO-KEY SYSTEM — read before touching transaction lookups:
2
+ //
3
+ // 1. transactionDetailState.transactionDetailById → keyed by getTransactionDetailKey()
4
+ // Format: "<qbo_id>_<type>" (strips the "tran_<uuid>:" prefix)
5
+ // Used by: all transactionDetail epics/selectors for detail metadata (fetch state, local data, etc.)
6
+ //
7
+ // 2. transactionState.transactionById → keyed by transactionId.id (full zeni ID, e.g. "tran_<uuid>:<qbo_id>")
8
+ // Used by: all list-fetch epics, getSupportedTransactionById, and all entity store reads/writes
9
+ //
10
+ // IMPORTANT: Never use getTransactionDetailKey() to look up or remove from transactionState.
11
+ // Always use transactionId.id for the entity store.
12
+ // Produces the transactionDetailState key: "<qbo_id>_<type>"
3
13
  export const getTransactionDetailKey = (transactionId) => `${getActualTransactionID(transactionId.id)}_${transactionId.type}`;
14
+ // Produces the full-zeni-ID-based key: "<tran_uuid:qbo_id>_<type>"
15
+ // Note: this key format is not used by the entity store (which uses transactionId.id directly).
4
16
  export const getZeniTransactionDetailKey = (transactionId) => `${transactionId.id}_${transactionId.type}`;
5
17
  export const getThirdPartyIdFromTransactionId = (transactionId) => {
6
18
  const zeniGeneratedId = transactionId.id;
@@ -1 +1 @@
1
- {"version":3,"file":"transactionDetailState.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/transactionDetailState.ts"],"names":[],"mappings":"AAoBA,sEAAsE;AACtE,aAAa;AACb,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,aAA4B,EAAE,EAAE,CACtE,GAAG,sBAAsB,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,EAAW,CAAC;AAI/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAA4B,EAAE,EAAE,CAC1E,GAAG,aAAa,CAAC,EAAE,IAAI,aAAa,CAAC,IAAI,EAAW,CAAC;AAMvD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,aAA4B,EACpB,EAAE;IACV,MAAM,eAAe,GAAG,aAAa,CAAC,EAAE,CAAC;IACzC,OAAO,sBAAsB,CAAC,eAAe,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,eAAuB,EAAE,EAAE;IAChE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACtC,WAAwB;IAExB,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CACxD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC/B,CAAC;IACF,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC3C,IAA8B,CAAC,kBAAkB,CAAC,GAAG,CACpD,CAAC,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CACtD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAqBD,MAAM,CAAC,MAAM,iCAAiC,GAA+B;IAC3E,4BAA4B,EAAE,EAAE;IAChC,UAAU,EAAE,aAAa;IACzB,KAAK,EAAE,SAAS;IAChB,aAAa,EAAE,SAAS;IACxB,6BAA6B,EAAE;QAC7B,sBAAsB,EAAE,aAAa;QACrC,UAAU,EAAE;YACV,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,gBAAgB,EAAE;YAChB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,0BAA0B,EAAE;YAC1B,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,qBAAqB,EAAE;YACrB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;KACF;IACD,0BAA0B,EAAE;QAC1B,YAAY,EAAE,EAAE;QAChB,wBAAwB,EAAE,KAAK;QAC/B,uDAAuD,EAAE;YACvD,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;KACF;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC;IACzC,CAAC;CACF,CAAC","sourcesContent":["import {\n FetchState,\n FetchStateAndError,\n FetchedState,\n ID,\n} from '../../commonStateTypes/common';\nimport {Recommendation} from '../../commonStateTypes/recommendationBase';\nimport {AccountBase} from '../../entity/account/accountState';\nimport {ClassBase} from '../../entity/class/classState';\nimport {CustomerBase} from '../../entity/customer/customerState';\nimport {EntityType} from '../../entity/genericEntity/entity';\nimport {\n Transaction,\n TransactionID,\n} from '../../entity/transaction/stateTypes/transaction';\nimport {LinkedTransactionLine} from '../../entity/transaction/stateTypes/transactionLine';\nimport {VendorBase} from '../../entity/vendor/vendorState';\nimport {EntityRecommendationKey} from '../recommendation/recommendationState';\nimport {TransactionDetailLocalData} from './transactionDetailTypes';\n\n// This transaction key only extracts the third party ID and uses that\n// for the ID\nexport const getTransactionDetailKey = (transactionId: TransactionID) =>\n `${getActualTransactionID(transactionId.id)}_${transactionId.type}` as const;\n\nexport type TransactionDetailKey = ReturnType<typeof getTransactionDetailKey>;\n\nexport const getZeniTransactionDetailKey = (transactionId: TransactionID) =>\n `${transactionId.id}_${transactionId.type}` as const;\n\nexport type ZeniTransactionDetailKey = ReturnType<\n typeof getTransactionDetailKey\n>;\n\nexport const getThirdPartyIdFromTransactionId = (\n transactionId: TransactionID\n): string => {\n const zeniGeneratedId = transactionId.id;\n return getActualTransactionID(zeniGeneratedId);\n};\n\n/**\n * Returns actual QBO transaction ID.\n * @param zeniGeneratedId zeni transaciton Id in the form of tran_<uuid>:<qbo_id>\n * @returns retruns the actual QBO transaction Id.\n * @note in case if the given transaction id itself is QBO id, the it just passes it back.\n */\nexport const getActualTransactionID = (zeniGeneratedId: string) => {\n const splittedIds = zeniGeneratedId.trim().split(':');\n if (splittedIds.length === 1) {\n return splittedIds[0];\n } else {\n return splittedIds[1];\n }\n};\n\nexport function getAllLinkedTransactions(\n transaction: Transaction\n): TransactionID[] {\n const result: TransactionID[] = [];\n\n transaction.linkedTransactions?.map((linkedTransaction) =>\n result.push(linkedTransaction)\n );\n transaction.lines?.map((line) => {\n if (line.type === 'linked_transaction_line') {\n (line as LinkedTransactionLine).linkedTransactions.map(\n (linkedTransaction) => result.push(linkedTransaction)\n );\n }\n });\n\n return result;\n}\n\nexport interface SupportedTransactionDetail extends FetchedState {\n //This will be unique as it is based on timestamp\n deleteStatusByAttachmentName: Record<string, FetchStateAndError>;\n transactionDetailLocalData: TransactionDetailLocalData;\n transactionDetailUpdateStatus: {\n bulkUpdateStatus: FetchStateAndError;\n consolidatedFetchState: FetchState;\n markAsNotMiscatStatus: FetchStateAndError;\n recommendationUpdateStatus: FetchStateAndError;\n saveStatus: FetchStateAndError;\n };\n attachments?: AccountingProviderAttachment;\n isUpdateNotAllowed?: boolean;\n transactionId?: TransactionID;\n}\ninterface AccountingProviderAttachment {\n blobs: [];\n fetchState: FetchStateAndError;\n}\nexport const initialSupportedTransactionDetail: SupportedTransactionDetail = {\n deleteStatusByAttachmentName: {},\n fetchState: 'Not-Started',\n error: undefined,\n transactionId: undefined,\n transactionDetailUpdateStatus: {\n consolidatedFetchState: 'Not-Started',\n saveStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n bulkUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n recommendationUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n markAsNotMiscatStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n transactionDetailLocalData: {\n lineItemById: {},\n isVendorUpdateAllChecked: false,\n vendorBulkUpdateCategoryClassRecommendationsFetchStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n\n hasValidState() {\n return this.fetchState === 'Completed';\n },\n};\n\nexport interface TransactionDetailState {\n accountingProviderAttachment: {\n attachmentDataByID: Record<ID, ArrayBuffer>;\n fetchState: FetchState;\n };\n\n transactionDetailById: Record<\n TransactionDetailKey,\n SupportedTransactionDetail | undefined\n >;\n}\n\nexport interface TransactionLineUpdates {\n account?: AccountBase;\n class?: ClassBase;\n customer?: CustomerBase;\n lineDescription?: string;\n recommendation?: Recommendation[];\n vendor?: VendorBase;\n}\n\nexport interface TransactionUpdates {\n updatesByLineId: Record<ID, TransactionLineUpdates>;\n customerId?: ID;\n memo?: string;\n vendorId?: ID;\n}\n\nexport interface EntityRelatedRecommendationUpdates {\n entityId: ID | null; // null indicates vendor/customer should be created on the fly\n entityType: EntityType;\n isBulkUpdate: boolean;\n recommendations: Recommendation;\n updatedEntityId: ID | undefined;\n vendorName?: string; // Required when entityId is null and entityType is 'vendor'\n}\n\nexport interface TransactionSaveUpdates {\n anyBulkUpdates: boolean; // If there is any bulk update to be done, then this will be true\n entityRelatedUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >;\n markAsMiscatUpdates: boolean;\n updates: TransactionUpdates;\n}\n"]}
1
+ {"version":3,"file":"transactionDetailState.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/transactionDetailState.ts"],"names":[],"mappings":"AAoBA,6DAA6D;AAC7D,EAAE;AACF,yFAAyF;AACzF,mEAAmE;AACnE,wGAAwG;AACxG,EAAE;AACF,iHAAiH;AACjH,mGAAmG;AACnG,EAAE;AACF,6FAA6F;AAC7F,oDAAoD;AAEpD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,aAA4B,EAAE,EAAE,CACtE,GAAG,sBAAsB,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,EAAW,CAAC;AAI/E,mEAAmE;AACnE,gGAAgG;AAChG,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAA4B,EAAE,EAAE,CAC1E,GAAG,aAAa,CAAC,EAAE,IAAI,aAAa,CAAC,IAAI,EAAW,CAAC;AAOvD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,aAA4B,EACpB,EAAE;IACV,MAAM,eAAe,GAAG,aAAa,CAAC,EAAE,CAAC;IACzC,OAAO,sBAAsB,CAAC,eAAe,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,eAAuB,EAAE,EAAE;IAChE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACtC,WAAwB;IAExB,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CACxD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC/B,CAAC;IACF,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC3C,IAA8B,CAAC,kBAAkB,CAAC,GAAG,CACpD,CAAC,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CACtD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAqBD,MAAM,CAAC,MAAM,iCAAiC,GAA+B;IAC3E,4BAA4B,EAAE,EAAE;IAChC,UAAU,EAAE,aAAa;IACzB,KAAK,EAAE,SAAS;IAChB,aAAa,EAAE,SAAS;IACxB,6BAA6B,EAAE;QAC7B,sBAAsB,EAAE,aAAa;QACrC,UAAU,EAAE;YACV,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,gBAAgB,EAAE;YAChB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,0BAA0B,EAAE;YAC1B,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,qBAAqB,EAAE;YACrB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;KACF;IACD,0BAA0B,EAAE;QAC1B,YAAY,EAAE,EAAE;QAChB,wBAAwB,EAAE,KAAK;QAC/B,uDAAuD,EAAE;YACvD,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;KACF;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC;IACzC,CAAC;CACF,CAAC","sourcesContent":["import {\n FetchState,\n FetchStateAndError,\n FetchedState,\n ID,\n} from '../../commonStateTypes/common';\nimport {Recommendation} from '../../commonStateTypes/recommendationBase';\nimport {AccountBase} from '../../entity/account/accountState';\nimport {ClassBase} from '../../entity/class/classState';\nimport {CustomerBase} from '../../entity/customer/customerState';\nimport {EntityType} from '../../entity/genericEntity/entity';\nimport {\n Transaction,\n TransactionID,\n} from '../../entity/transaction/stateTypes/transaction';\nimport {LinkedTransactionLine} from '../../entity/transaction/stateTypes/transactionLine';\nimport {VendorBase} from '../../entity/vendor/vendorState';\nimport {EntityRecommendationKey} from '../recommendation/recommendationState';\nimport {TransactionDetailLocalData} from './transactionDetailTypes';\n\n// TWO-KEY SYSTEM — read before touching transaction lookups:\n//\n// 1. transactionDetailState.transactionDetailById → keyed by getTransactionDetailKey()\n// Format: \"<qbo_id>_<type>\" (strips the \"tran_<uuid>:\" prefix)\n// Used by: all transactionDetail epics/selectors for detail metadata (fetch state, local data, etc.)\n//\n// 2. transactionState.transactionById → keyed by transactionId.id (full zeni ID, e.g. \"tran_<uuid>:<qbo_id>\")\n// Used by: all list-fetch epics, getSupportedTransactionById, and all entity store reads/writes\n//\n// IMPORTANT: Never use getTransactionDetailKey() to look up or remove from transactionState.\n// Always use transactionId.id for the entity store.\n\n// Produces the transactionDetailState key: \"<qbo_id>_<type>\"\nexport const getTransactionDetailKey = (transactionId: TransactionID) =>\n `${getActualTransactionID(transactionId.id)}_${transactionId.type}` as const;\n\nexport type TransactionDetailKey = ReturnType<typeof getTransactionDetailKey>;\n\n// Produces the full-zeni-ID-based key: \"<tran_uuid:qbo_id>_<type>\"\n// Note: this key format is not used by the entity store (which uses transactionId.id directly).\nexport const getZeniTransactionDetailKey = (transactionId: TransactionID) =>\n `${transactionId.id}_${transactionId.type}` as const;\n\n// Fixed: was previously (incorrectly) typed as ReturnType<typeof getTransactionDetailKey>\nexport type ZeniTransactionDetailKey = ReturnType<\n typeof getZeniTransactionDetailKey\n>;\n\nexport const getThirdPartyIdFromTransactionId = (\n transactionId: TransactionID\n): string => {\n const zeniGeneratedId = transactionId.id;\n return getActualTransactionID(zeniGeneratedId);\n};\n\n/**\n * Returns actual QBO transaction ID.\n * @param zeniGeneratedId zeni transaciton Id in the form of tran_<uuid>:<qbo_id>\n * @returns retruns the actual QBO transaction Id.\n * @note in case if the given transaction id itself is QBO id, the it just passes it back.\n */\nexport const getActualTransactionID = (zeniGeneratedId: string) => {\n const splittedIds = zeniGeneratedId.trim().split(':');\n if (splittedIds.length === 1) {\n return splittedIds[0];\n } else {\n return splittedIds[1];\n }\n};\n\nexport function getAllLinkedTransactions(\n transaction: Transaction\n): TransactionID[] {\n const result: TransactionID[] = [];\n\n transaction.linkedTransactions?.map((linkedTransaction) =>\n result.push(linkedTransaction)\n );\n transaction.lines?.map((line) => {\n if (line.type === 'linked_transaction_line') {\n (line as LinkedTransactionLine).linkedTransactions.map(\n (linkedTransaction) => result.push(linkedTransaction)\n );\n }\n });\n\n return result;\n}\n\nexport interface SupportedTransactionDetail extends FetchedState {\n //This will be unique as it is based on timestamp\n deleteStatusByAttachmentName: Record<string, FetchStateAndError>;\n transactionDetailLocalData: TransactionDetailLocalData;\n transactionDetailUpdateStatus: {\n bulkUpdateStatus: FetchStateAndError;\n consolidatedFetchState: FetchState;\n markAsNotMiscatStatus: FetchStateAndError;\n recommendationUpdateStatus: FetchStateAndError;\n saveStatus: FetchStateAndError;\n };\n attachments?: AccountingProviderAttachment;\n isUpdateNotAllowed?: boolean;\n transactionId?: TransactionID;\n}\ninterface AccountingProviderAttachment {\n blobs: [];\n fetchState: FetchStateAndError;\n}\nexport const initialSupportedTransactionDetail: SupportedTransactionDetail = {\n deleteStatusByAttachmentName: {},\n fetchState: 'Not-Started',\n error: undefined,\n transactionId: undefined,\n transactionDetailUpdateStatus: {\n consolidatedFetchState: 'Not-Started',\n saveStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n bulkUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n recommendationUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n markAsNotMiscatStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n transactionDetailLocalData: {\n lineItemById: {},\n isVendorUpdateAllChecked: false,\n vendorBulkUpdateCategoryClassRecommendationsFetchStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n\n hasValidState() {\n return this.fetchState === 'Completed';\n },\n};\n\nexport interface TransactionDetailState {\n accountingProviderAttachment: {\n attachmentDataByID: Record<ID, ArrayBuffer>;\n fetchState: FetchState;\n };\n\n transactionDetailById: Record<\n TransactionDetailKey,\n SupportedTransactionDetail | undefined\n >;\n}\n\nexport interface TransactionLineUpdates {\n account?: AccountBase;\n class?: ClassBase;\n customer?: CustomerBase;\n lineDescription?: string;\n recommendation?: Recommendation[];\n vendor?: VendorBase;\n}\n\nexport interface TransactionUpdates {\n updatesByLineId: Record<ID, TransactionLineUpdates>;\n customerId?: ID;\n memo?: string;\n vendorId?: ID;\n}\n\nexport interface EntityRelatedRecommendationUpdates {\n entityId: ID | null; // null indicates vendor/customer should be created on the fly\n entityType: EntityType;\n isBulkUpdate: boolean;\n recommendations: Recommendation;\n updatedEntityId: ID | undefined;\n vendorName?: string; // Required when entityId is null and entityType is 'vendor'\n}\n\nexport interface TransactionSaveUpdates {\n anyBulkUpdates: boolean; // If there is any bulk update to be done, then this will be true\n entityRelatedUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >;\n markAsMiscatUpdates: boolean;\n updates: TransactionUpdates;\n}\n"]}
@@ -7,13 +7,11 @@ const transactionSelector_1 = require("../../../entity/transaction/transactionSe
7
7
  const accountListSelector_1 = require("../../accountList/accountListSelector");
8
8
  const transactionDetailLocalDataHelper_1 = require("../transactionDetailLocalDataHelper");
9
9
  const transactionDetailReducer_1 = require("../transactionDetailReducer");
10
- const transactionDetailState_1 = require("../transactionDetailState");
11
10
  const initializeTransactionDetailLocalDataEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(transactionDetailReducer_1.initializeTransactionDetailLocalData.match), (0, operators_1.mergeMap)((action) => {
12
11
  const { transactionId, vendorId } = action.payload;
13
12
  const fetchActions = [];
14
13
  const transactionState = state$.value.transactionState;
15
- const key = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
16
- const detail = (0, transactionSelector_1.getSupportedTransactionById)(transactionState, key);
14
+ const detail = (0, transactionSelector_1.getSupportedTransactionById)(transactionState, transactionId.id); // entity store uses full zeni ID as canonical key
17
15
  if (detail != null) {
18
16
  const uncategorizedIncomeExpense = (0, accountListSelector_1.getUncategorizedAccounts)(state$.value.accountState, state$.value.accountListState, 'accountList');
19
17
  const localData = (0, transactionDetailLocalDataHelper_1.toTransactionDetailLocalData)(detail, vendorId, uncategorizedIncomeExpense);
@@ -1 +1 @@
1
- {"version":3,"file":"initializeTransactionDetailLocalDataEpic.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.ts"],"names":[],"mappings":";;;AACA,+BAA0B;AAC1B,8CAAgD;AAEhD,yFAA4F;AAE5F,+EAA+E;AAC/E,0FAAiF;AACjF,0EAIqC;AACrC,sEAAkE;AAO3D,MAAM,wCAAwC,GAAG,CACtD,QAAuC,EACvC,MAAkC,EAClC,EAAE,CACF,QAAQ,CAAC,IAAI,CACX,IAAA,kBAAM,EAAC,+DAAoC,CAAC,KAAK,CAAC,EAClD,IAAA,oBAAQ,EAAC,CAAC,MAAM,EAAE,EAAE;IAClB,MAAM,EAAC,aAAa,EAAE,QAAQ,EAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACjD,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,GAAG,GAAG,IAAA,gDAAuB,EAAC,aAAa,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAA,iDAA2B,EAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,0BAA0B,GAAG,IAAA,8CAAwB,EACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAC7B,aAAa,CACd,CAAC;QACF,MAAM,SAAS,GAAG,IAAA,+DAA4B,EAC5C,MAAM,EACN,QAAQ,EACR,0BAA0B,CAC3B,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,IAAA,0DAA+B,EAAC,EAAC,aAAa,EAAC,CAAC,CAAC,CAAC;QACpE,YAAY,CAAC,IAAI,CACf,IAAA,yDAA8B,EAAC;YAC7B,aAAa;YACb,oBAAoB,EAAE,SAAS;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,IAAA,WAAI,EAAC,YAAY,CAAC,CAAC;AAC5B,CAAC,CAAC,CACH,CAAC;AAjCS,QAAA,wCAAwC,4CAiCjD","sourcesContent":["import {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from} from 'rxjs';\nimport {filter, mergeMap} from 'rxjs/operators';\n\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {RootState} from '../../../reducer';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {toTransactionDetailLocalData} from '../transactionDetailLocalDataHelper';\nimport {\n clearTransactionDetailLocalData,\n initializeTransactionDetailLocalData,\n saveTransactionDetailLocalData,\n} from '../transactionDetailReducer';\nimport {getTransactionDetailKey} from '../transactionDetailState';\n\nexport type ActionType =\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof saveTransactionDetailLocalData>\n | ReturnType<typeof clearTransactionDetailLocalData>;\n\nexport const initializeTransactionDetailLocalDataEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>\n) =>\n actions$.pipe(\n filter(initializeTransactionDetailLocalData.match),\n mergeMap((action) => {\n const {transactionId, vendorId} = action.payload;\n const fetchActions: ActionType[] = [];\n const transactionState = state$.value.transactionState;\n const key = getTransactionDetailKey(transactionId);\n const detail = getSupportedTransactionById(transactionState, key);\n if (detail != null) {\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n const localData = toTransactionDetailLocalData(\n detail,\n vendorId,\n uncategorizedIncomeExpense\n );\n fetchActions.push(clearTransactionDetailLocalData({transactionId}));\n fetchActions.push(\n saveTransactionDetailLocalData({\n transactionId,\n transactionLocalData: localData,\n })\n );\n }\n return from(fetchActions);\n })\n );\n"]}
1
+ {"version":3,"file":"initializeTransactionDetailLocalDataEpic.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/epics/initializeTransactionDetailLocalDataEpic.ts"],"names":[],"mappings":";;;AACA,+BAA0B;AAC1B,8CAAgD;AAEhD,yFAA4F;AAE5F,+EAA+E;AAC/E,0FAAiF;AACjF,0EAIqC;AAO9B,MAAM,wCAAwC,GAAG,CACtD,QAAuC,EACvC,MAAkC,EAClC,EAAE,CACF,QAAQ,CAAC,IAAI,CACX,IAAA,kBAAM,EAAC,+DAAoC,CAAC,KAAK,CAAC,EAClD,IAAA,oBAAQ,EAAC,CAAC,MAAM,EAAE,EAAE;IAClB,MAAM,EAAC,aAAa,EAAE,QAAQ,EAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACjD,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,MAAM,GAAG,IAAA,iDAA2B,EAAC,gBAAgB,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,kDAAkD;IAClI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,0BAA0B,GAAG,IAAA,8CAAwB,EACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAC7B,aAAa,CACd,CAAC;QACF,MAAM,SAAS,GAAG,IAAA,+DAA4B,EAC5C,MAAM,EACN,QAAQ,EACR,0BAA0B,CAC3B,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,IAAA,0DAA+B,EAAC,EAAC,aAAa,EAAC,CAAC,CAAC,CAAC;QACpE,YAAY,CAAC,IAAI,CACf,IAAA,yDAA8B,EAAC;YAC7B,aAAa;YACb,oBAAoB,EAAE,SAAS;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,IAAA,WAAI,EAAC,YAAY,CAAC,CAAC;AAC5B,CAAC,CAAC,CACH,CAAC;AAhCS,QAAA,wCAAwC,4CAgCjD","sourcesContent":["import {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from} from 'rxjs';\nimport {filter, mergeMap} from 'rxjs/operators';\n\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {RootState} from '../../../reducer';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {toTransactionDetailLocalData} from '../transactionDetailLocalDataHelper';\nimport {\n clearTransactionDetailLocalData,\n initializeTransactionDetailLocalData,\n saveTransactionDetailLocalData,\n} from '../transactionDetailReducer';\n\nexport type ActionType =\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof saveTransactionDetailLocalData>\n | ReturnType<typeof clearTransactionDetailLocalData>;\n\nexport const initializeTransactionDetailLocalDataEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>\n) =>\n actions$.pipe(\n filter(initializeTransactionDetailLocalData.match),\n mergeMap((action) => {\n const {transactionId, vendorId} = action.payload;\n const fetchActions: ActionType[] = [];\n const transactionState = state$.value.transactionState;\n const detail = getSupportedTransactionById(transactionState, transactionId.id); // entity store uses full zeni ID as canonical key\n if (detail != null) {\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n const localData = toTransactionDetailLocalData(\n detail,\n vendorId,\n uncategorizedIncomeExpense\n );\n fetchActions.push(clearTransactionDetailLocalData({transactionId}));\n fetchActions.push(\n saveTransactionDetailLocalData({\n transactionId,\n transactionLocalData: localData,\n })\n );\n }\n return from(fetchActions);\n })\n );\n"]}
@@ -27,7 +27,7 @@ const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(
27
27
  const detailKey = (0, transactionDetailState_1.getTransactionDetailKey)(transactionId);
28
28
  const transactionActions = [];
29
29
  if (cacheOverride === true) {
30
- const transaction = (0, transactionSelector_1.getSupportedTransactionById)(state$.value.transactionState, detailKey);
30
+ const transaction = (0, transactionSelector_1.getSupportedTransactionById)(state$.value.transactionState, transactionId.id);
31
31
  transactionActions.push(...removeCompleteTransaction(transactionId, transaction));
32
32
  }
33
33
  const transactionDetail = (0, get_1.default)(state$.value.transactionDetailState.transactionDetailById, detailKey, undefined);
@@ -52,6 +52,12 @@ const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(
52
52
  //
53
53
  // The entity store canonical key is the full zeni ID (transactionId.id),
54
54
  // which is the same key used by all list-fetch epics.
55
+ //
56
+ // DEPENDENCY: The web-components TransactionDetailPage sets effectiveIsDisabled
57
+ // to "disabled" while fetchState !== "Completed". This prevents any user edits
58
+ // between this early init and the second init dispatched on API response (below).
59
+ // If that guard is ever removed, user edits made against partial list data will
60
+ // be silently overwritten when the full detail response arrives.
55
61
  if (cacheOverride !== true) {
56
62
  const existingTransaction = (0, transactionSelector_1.getSupportedTransactionById)(state$.value.transactionState, transactionId.id);
57
63
  if (existingTransaction != null) {
@@ -68,7 +74,7 @@ const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(
68
74
  if ((0, responsePayload_1.isSuccessResponse)(response) &&
69
75
  response.data?.transaction?.transaction_id != null) {
70
76
  const updateActions = [];
71
- const transcationId = (0, transactionIDPayload_1.toTransactionID)(response.data.transaction);
77
+ const responseTransactionId = (0, transactionIDPayload_1.toTransactionID)(response.data.transaction);
72
78
  const responseData = {
73
79
  ...response.data,
74
80
  vendors: response.data.vendors?.map((vendor) => ({
@@ -79,15 +85,15 @@ const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(
79
85
  if (responseData.vendors.length > 0) {
80
86
  updateActions.push((0, vendorReducer_1.updateVendors)(responseData.vendors, 'merge'));
81
87
  }
82
- // Use the full zeni ID (transcationId.id) as the entity store key
83
- // so it matches how all list-fetch epics save transactions, avoiding
88
+ // Use the full zeni ID as the entity store key so it matches
89
+ // how all list-fetch epics save transactions, avoiding
84
90
  // duplicate entries under different key formats.
85
- updateActions.push((0, transactionReducer_1.updateTransaction)(transcationId.id, responseData.transaction));
91
+ updateActions.push((0, transactionReducer_1.updateTransaction)(responseTransactionId.id, responseData.transaction));
86
92
  updateActions.push((0, transactionDetailReducer_1.initializeTransactionDetailLocalData)({
87
- transactionId: transcationId,
93
+ transactionId: responseTransactionId,
88
94
  vendorId: responseData.vendors[0]?.vendor_id,
89
95
  }));
90
- updateActions.push((0, transactionDetailReducer_1.updateTransactionDetailFetchState)(transcationId, 'Completed'));
96
+ updateActions.push((0, transactionDetailReducer_1.updateTransactionDetailFetchState)(responseTransactionId, 'Completed'));
91
97
  // IMPORTANT: Fetch linked transactions..
92
98
  updateActions.push(...getAllFetchLinkedTransactionDetailActions(responseData.transaction, state$.value));
93
99
  if (responseData.vendors.length > 0) {
@@ -123,12 +129,15 @@ function removeCompleteTransaction(transactionId, transaction) {
123
129
  const actions = [];
124
130
  actions.push((0, transactionDetailReducer_1.removeTransactionDetail)(transactionId));
125
131
  if (transaction != null) {
126
- actions.push((0, transactionReducer_1.removeTransaction)((0, transactionDetailState_1.getTransactionDetailKey)(transactionId)));
132
+ // Use transactionId.id (full zeni ID) — the canonical entity store key.
133
+ // getTransactionDetailKey produces a different composite key used only by
134
+ // transactionDetailState, not the entity store.
135
+ actions.push((0, transactionReducer_1.removeTransaction)(transactionId.id));
127
136
  // remove all the linked transactions too..
128
137
  const linkedTransactions = (0, transactionDetailState_1.getAllLinkedTransactions)(transaction);
129
138
  linkedTransactions.forEach((linkedTransaction) => {
130
139
  actions.push((0, transactionDetailReducer_1.removeTransactionDetail)(linkedTransaction));
131
- actions.push((0, transactionReducer_1.removeTransaction)((0, transactionDetailState_1.getTransactionDetailKey)(linkedTransaction)));
140
+ actions.push((0, transactionReducer_1.removeTransaction)(linkedTransaction.id));
132
141
  });
133
142
  }
134
143
  return actions;
@@ -1 +1 @@
1
- {"version":3,"file":"transactionDetailEpic.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/epics/transactionDetailEpic.ts"],"names":[],"mappings":"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","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {Observable, concat, from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {\n TransactionPayload,\n toTransaction,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n Transaction,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {toVendorTransactionTypeStrict} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n removeTransaction,\n updateTransaction,\n} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {mapVendorPayloadToVendor} from '../../../entity/vendor/vendorPayload';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {RootState} from '../../../reducer';\nimport {createZeniAPIStatus, isSuccessResponse} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {fetchAccountList} from '../../accountList/accountListReducer';\nimport {fetchClassList} from '../../classList/classListReducer';\nimport {getInitializedTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorLocalDataHelper';\nimport {updateTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorViewReducer';\nimport {fetchOwnerList} from '../../ownerList/ownerListReducer';\nimport {updateSortUiState} from '../../vendorList/vendorListReducer';\nimport {TransactionDetailResponse} from '../transactionDetailPayload';\nimport {\n fetchTransactionDetail,\n initializeTransactionDetailLocalData,\n removeTransactionDetail,\n updateTransactionDetailFetchState,\n} from '../transactionDetailReducer';\nimport {\n getAllLinkedTransactions,\n getTransactionDetailKey,\n} from '../transactionDetailState';\n\nexport type ActionType =\n | ReturnType<typeof fetchTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactionDetailFetchState>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof removeTransaction>\n | ReturnType<typeof removeTransactionDetail>\n | ReturnType<typeof fetchClassList>\n | ReturnType<typeof fetchAccountList>\n | ReturnType<typeof updateSortUiState>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof updateTransactionVendorLocalData>\n | ReturnType<typeof fetchOwnerList>;\n\nexport const fetchTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n): Observable<ActionType> =>\n actions$.pipe(\n filter(fetchTransactionDetail.match),\n mergeMap((action) => {\n const {transactionId, cacheOverride} = action.payload;\n const detailKey = getTransactionDetailKey(transactionId);\n const transactionActions: ActionType[] = [];\n\n if (cacheOverride === true) {\n const transaction = getSupportedTransactionById(\n state$.value.transactionState,\n detailKey\n );\n transactionActions.push(\n ...removeCompleteTransaction(transactionId, transaction)\n );\n }\n\n const transactionDetail = recordGet(\n state$.value.transactionDetailState.transactionDetailById,\n detailKey,\n undefined\n );\n\n if (\n cacheOverride === true ||\n transactionDetail == null ||\n (transactionDetail.hasValidState() === false &&\n transactionDetail.fetchState !== 'In-Progress')\n ) {\n const accountList =\n state$.value.accountListState.byReportId.accountList;\n if (\n accountList.hasValidState() === false &&\n accountList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchAccountList('accountList'));\n }\n const classList = state$.value.classListState;\n if (\n classList.hasValidState() === false &&\n classList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchClassList());\n }\n\n transactionActions.push(\n updateTransactionDetailFetchState(transactionId, 'In-Progress')\n );\n\n // If the transaction already exists in the entity store (e.g. fetched by the\n // list page), initialize local data immediately so the UI can render whatever\n // data is available while the full detail fetch completes in parallel.\n //\n // The entity store canonical key is the full zeni ID (transactionId.id),\n // which is the same key used by all list-fetch epics.\n if (cacheOverride !== true) {\n const existingTransaction = getSupportedTransactionById(\n state$.value.transactionState,\n transactionId.id\n );\n if (existingTransaction != null) {\n transactionActions.push(\n initializeTransactionDetailLocalData({\n transactionId,\n vendorId: existingTransaction.vendorId,\n })\n );\n }\n }\n\n const query = {transaction_type: transactionId.type};\n const getTransactionDetail$ = zeniAPI\n .getJSON<TransactionDetailResponse>(\n `${\n zeniAPI.apiEndPoints.accountMicroServiceBaseUrl\n }/1.0/transactions/${transactionId.id}?query=${encodeURIComponent(\n JSON.stringify(query)\n )}`\n )\n .pipe(\n mergeMap((response) => {\n if (\n isSuccessResponse(response) &&\n response.data?.transaction?.transaction_id != null\n ) {\n const updateActions: ActionType[] = [];\n const transcationId = toTransactionID(\n response.data.transaction\n );\n\n const responseData = {\n ...response.data,\n vendors:\n response.data.vendors?.map((vendor) => ({\n ...vendor,\n vendor_id: vendor.qbo_id ?? vendor.vendor_id,\n })) ?? [],\n };\n\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateVendors(responseData.vendors, 'merge')\n );\n }\n // Use the full zeni ID (transcationId.id) as the entity store key\n // so it matches how all list-fetch epics save transactions, avoiding\n // duplicate entries under different key formats.\n updateActions.push(\n updateTransaction(\n transcationId.id,\n responseData.transaction\n )\n );\n updateActions.push(\n initializeTransactionDetailLocalData({\n transactionId: transcationId,\n vendorId: responseData.vendors[0]?.vendor_id,\n })\n );\n updateActions.push(\n updateTransactionDetailFetchState(transcationId, 'Completed')\n );\n // IMPORTANT: Fetch linked transactions..\n updateActions.push(\n ...getAllFetchLinkedTransactionDetailActions(\n responseData.transaction,\n state$.value\n )\n );\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateTransactionVendorLocalData({\n vendorId: responseData.vendors[0].vendor_id,\n localData: getInitializedTransactionVendorLocalData(\n mapVendorPayloadToVendor(responseData.vendors[0])\n ),\n })\n );\n }\n // If vendor transaction, fetch owners list\n if (\n toVendorTransactionTypeStrict(\n responseData.transaction.transaction_type\n ) != null\n ) {\n updateActions.push(fetchOwnerList());\n }\n return from(updateActions);\n } else {\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) => {\n console.error(`REST API call errored out ${error}`);\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n );\n })\n );\n\n return concat(from(transactionActions), getTransactionDetail$);\n } else {\n return from(transactionActions);\n }\n })\n );\n\n/**\n * Helper functions\n */\n\nfunction removeCompleteTransaction(\n transactionId: TransactionID,\n transaction: Transaction | undefined\n): ActionType[] {\n const actions: ActionType[] = [];\n actions.push(removeTransactionDetail(transactionId));\n if (transaction != null) {\n actions.push(removeTransaction(getTransactionDetailKey(transactionId)));\n // remove all the linked transactions too..\n const linkedTransactions = getAllLinkedTransactions(transaction);\n linkedTransactions.forEach((linkedTransaction) => {\n actions.push(removeTransactionDetail(linkedTransaction));\n actions.push(\n removeTransaction(getTransactionDetailKey(linkedTransaction))\n );\n });\n }\n\n return actions;\n}\n\nfunction isTransactionDetailInCacheOrFetching(\n transactionId: TransactionID,\n state: RootState\n): boolean {\n const detailKey = getTransactionDetailKey(transactionId);\n const detail = state.transactionDetailState.transactionDetailById[detailKey];\n\n return (\n detail != null &&\n (detail.hasValidState() === true || detail.fetchState === 'In-Progress')\n );\n}\n\nfunction getAllFetchLinkedTransactionDetailActions(\n transactionPayload: TransactionPayload,\n state: RootState\n): ReturnType<typeof fetchTransactionDetail>[] {\n const fetchLinkedTransactionActions: ReturnType<\n typeof fetchTransactionDetail\n >[] = [];\n\n const currentTransaction = toTransaction(transactionPayload);\n const linkedTransaction = getAllLinkedTransactions(currentTransaction);\n\n const linkedTransactionFiltered = linkedTransaction.filter(\n (value) => isTransactionDetailInCacheOrFetching(value, state) === false\n );\n\n linkedTransactionFiltered.forEach((transactionDetailToFetch) =>\n fetchLinkedTransactionActions.push(\n fetchTransactionDetail(transactionDetailToFetch, false)\n )\n );\n if (linkedTransactionFiltered.length === 0) {\n console.log(\n 'Phew all linked transactions are fetched or there are no linked transactions..'\n );\n }\n return fetchLinkedTransactionActions;\n}\n"]}
1
+ {"version":3,"file":"transactionDetailEpic.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/epics/transactionDetailEpic.ts"],"names":[],"mappings":"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","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {Observable, concat, from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {\n TransactionPayload,\n toTransaction,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n Transaction,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {toVendorTransactionTypeStrict} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n removeTransaction,\n updateTransaction,\n} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {mapVendorPayloadToVendor} from '../../../entity/vendor/vendorPayload';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {RootState} from '../../../reducer';\nimport {createZeniAPIStatus, isSuccessResponse} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {fetchAccountList} from '../../accountList/accountListReducer';\nimport {fetchClassList} from '../../classList/classListReducer';\nimport {getInitializedTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorLocalDataHelper';\nimport {updateTransactionVendorLocalData} from '../../commonVendorView/transactionVendorView/transactionVendorViewReducer';\nimport {fetchOwnerList} from '../../ownerList/ownerListReducer';\nimport {updateSortUiState} from '../../vendorList/vendorListReducer';\nimport {TransactionDetailResponse} from '../transactionDetailPayload';\nimport {\n fetchTransactionDetail,\n initializeTransactionDetailLocalData,\n removeTransactionDetail,\n updateTransactionDetailFetchState,\n} from '../transactionDetailReducer';\nimport {\n getAllLinkedTransactions,\n getTransactionDetailKey,\n} from '../transactionDetailState';\n\nexport type ActionType =\n | ReturnType<typeof fetchTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactionDetailFetchState>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof removeTransaction>\n | ReturnType<typeof removeTransactionDetail>\n | ReturnType<typeof fetchClassList>\n | ReturnType<typeof fetchAccountList>\n | ReturnType<typeof updateSortUiState>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof updateTransactionVendorLocalData>\n | ReturnType<typeof fetchOwnerList>;\n\nexport const fetchTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n): Observable<ActionType> =>\n actions$.pipe(\n filter(fetchTransactionDetail.match),\n mergeMap((action) => {\n const {transactionId, cacheOverride} = action.payload;\n const detailKey = getTransactionDetailKey(transactionId);\n const transactionActions: ActionType[] = [];\n\n if (cacheOverride === true) {\n const transaction = getSupportedTransactionById(\n state$.value.transactionState,\n transactionId.id\n );\n transactionActions.push(\n ...removeCompleteTransaction(transactionId, transaction)\n );\n }\n\n const transactionDetail = recordGet(\n state$.value.transactionDetailState.transactionDetailById,\n detailKey,\n undefined\n );\n\n if (\n cacheOverride === true ||\n transactionDetail == null ||\n (transactionDetail.hasValidState() === false &&\n transactionDetail.fetchState !== 'In-Progress')\n ) {\n const accountList =\n state$.value.accountListState.byReportId.accountList;\n if (\n accountList.hasValidState() === false &&\n accountList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchAccountList('accountList'));\n }\n const classList = state$.value.classListState;\n if (\n classList.hasValidState() === false &&\n classList.fetchState !== 'In-Progress'\n ) {\n transactionActions.push(fetchClassList());\n }\n\n transactionActions.push(\n updateTransactionDetailFetchState(transactionId, 'In-Progress')\n );\n\n // If the transaction already exists in the entity store (e.g. fetched by the\n // list page), initialize local data immediately so the UI can render whatever\n // data is available while the full detail fetch completes in parallel.\n //\n // The entity store canonical key is the full zeni ID (transactionId.id),\n // which is the same key used by all list-fetch epics.\n //\n // DEPENDENCY: The web-components TransactionDetailPage sets effectiveIsDisabled\n // to \"disabled\" while fetchState !== \"Completed\". This prevents any user edits\n // between this early init and the second init dispatched on API response (below).\n // If that guard is ever removed, user edits made against partial list data will\n // be silently overwritten when the full detail response arrives.\n if (cacheOverride !== true) {\n const existingTransaction = getSupportedTransactionById(\n state$.value.transactionState,\n transactionId.id\n );\n if (existingTransaction != null) {\n transactionActions.push(\n initializeTransactionDetailLocalData({\n transactionId,\n vendorId: existingTransaction.vendorId,\n })\n );\n }\n }\n\n const query = {transaction_type: transactionId.type};\n const getTransactionDetail$ = zeniAPI\n .getJSON<TransactionDetailResponse>(\n `${\n zeniAPI.apiEndPoints.accountMicroServiceBaseUrl\n }/1.0/transactions/${transactionId.id}?query=${encodeURIComponent(\n JSON.stringify(query)\n )}`\n )\n .pipe(\n mergeMap((response) => {\n if (\n isSuccessResponse(response) &&\n response.data?.transaction?.transaction_id != null\n ) {\n const updateActions: ActionType[] = [];\n const responseTransactionId = toTransactionID(\n response.data.transaction\n );\n\n const responseData = {\n ...response.data,\n vendors:\n response.data.vendors?.map((vendor) => ({\n ...vendor,\n vendor_id: vendor.qbo_id ?? vendor.vendor_id,\n })) ?? [],\n };\n\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateVendors(responseData.vendors, 'merge')\n );\n }\n // Use the full zeni ID as the entity store key so it matches\n // how all list-fetch epics save transactions, avoiding\n // duplicate entries under different key formats.\n updateActions.push(\n updateTransaction(\n responseTransactionId.id,\n responseData.transaction\n )\n );\n updateActions.push(\n initializeTransactionDetailLocalData({\n transactionId: responseTransactionId,\n vendorId: responseData.vendors[0]?.vendor_id,\n })\n );\n updateActions.push(\n updateTransactionDetailFetchState(responseTransactionId, 'Completed')\n );\n // IMPORTANT: Fetch linked transactions..\n updateActions.push(\n ...getAllFetchLinkedTransactionDetailActions(\n responseData.transaction,\n state$.value\n )\n );\n if (responseData.vendors.length > 0) {\n updateActions.push(\n updateTransactionVendorLocalData({\n vendorId: responseData.vendors[0].vendor_id,\n localData: getInitializedTransactionVendorLocalData(\n mapVendorPayloadToVendor(responseData.vendors[0])\n ),\n })\n );\n }\n // If vendor transaction, fetch owners list\n if (\n toVendorTransactionTypeStrict(\n responseData.transaction.transaction_type\n ) != null\n ) {\n updateActions.push(fetchOwnerList());\n }\n return from(updateActions);\n } else {\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) => {\n console.error(`REST API call errored out ${error}`);\n return of(\n updateTransactionDetailFetchState(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n );\n })\n );\n\n return concat(from(transactionActions), getTransactionDetail$);\n } else {\n return from(transactionActions);\n }\n })\n );\n\n/**\n * Helper functions\n */\n\nfunction removeCompleteTransaction(\n transactionId: TransactionID,\n transaction: Transaction | undefined\n): ActionType[] {\n const actions: ActionType[] = [];\n actions.push(removeTransactionDetail(transactionId));\n if (transaction != null) {\n // Use transactionId.id (full zeni ID) — the canonical entity store key.\n // getTransactionDetailKey produces a different composite key used only by\n // transactionDetailState, not the entity store.\n actions.push(removeTransaction(transactionId.id));\n // remove all the linked transactions too..\n const linkedTransactions = getAllLinkedTransactions(transaction);\n linkedTransactions.forEach((linkedTransaction) => {\n actions.push(removeTransactionDetail(linkedTransaction));\n actions.push(removeTransaction(linkedTransaction.id));\n });\n }\n\n return actions;\n}\n\nfunction isTransactionDetailInCacheOrFetching(\n transactionId: TransactionID,\n state: RootState\n): boolean {\n const detailKey = getTransactionDetailKey(transactionId);\n const detail = state.transactionDetailState.transactionDetailById[detailKey];\n\n return (\n detail != null &&\n (detail.hasValidState() === true || detail.fetchState === 'In-Progress')\n );\n}\n\nfunction getAllFetchLinkedTransactionDetailActions(\n transactionPayload: TransactionPayload,\n state: RootState\n): ReturnType<typeof fetchTransactionDetail>[] {\n const fetchLinkedTransactionActions: ReturnType<\n typeof fetchTransactionDetail\n >[] = [];\n\n const currentTransaction = toTransaction(transactionPayload);\n const linkedTransaction = getAllLinkedTransactions(currentTransaction);\n\n const linkedTransactionFiltered = linkedTransaction.filter(\n (value) => isTransactionDetailInCacheOrFetching(value, state) === false\n );\n\n linkedTransactionFiltered.forEach((transactionDetailToFetch) =>\n fetchLinkedTransactionActions.push(\n fetchTransactionDetail(transactionDetailToFetch, false)\n )\n );\n if (linkedTransactionFiltered.length === 0) {\n console.log(\n 'Phew all linked transactions are fetched or there are no linked transactions..'\n );\n }\n return fetchLinkedTransactionActions;\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  import { ActionsObservable, StateObservable } from 'redux-observable';
2
2
  import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
3
- import { updateTransaction, updateTransactions } from '../../../entity/transaction/transactionReducer';
3
+ import { updateTransaction } from '../../../entity/transaction/transactionReducer';
4
4
  import { updateVendors } from '../../../entity/vendor/vendorReducer';
5
5
  import { RootState } from '../../../reducer';
6
6
  import { ZeniAPI } from '../../../zeniAPI';
7
7
  import { syncTransactionCategorizationFromDetailSave } from '../../expenseAutomationView/reducers/transactionsViewReducer';
8
8
  import { initializeTransactionDetailLocalData, markTransactionAsNotMiscategorized, updateStatusConsolidatedSaveTransactionDetail, updateTransactionDetail, updateTransactionDetailSaveStatus, updateTransactionStateIfUpdateActionNotAllowed } from '../transactionDetailReducer';
9
- export type ActionType = ReturnType<typeof updateTransactionDetail> | ReturnType<typeof updateTransaction> | ReturnType<typeof updateTransactions> | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed> | ReturnType<typeof openSnackbar> | ReturnType<typeof updateTransactionDetailSaveStatus> | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail> | ReturnType<typeof initializeTransactionDetailLocalData> | ReturnType<typeof updateVendors> | ReturnType<typeof markTransactionAsNotMiscategorized> | ReturnType<typeof syncTransactionCategorizationFromDetailSave>;
9
+ export type ActionType = ReturnType<typeof updateTransactionDetail> | ReturnType<typeof updateTransaction> | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed> | ReturnType<typeof openSnackbar> | ReturnType<typeof updateTransactionDetailSaveStatus> | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail> | ReturnType<typeof initializeTransactionDetailLocalData> | ReturnType<typeof updateVendors> | ReturnType<typeof markTransactionAsNotMiscategorized> | ReturnType<typeof syncTransactionCategorizationFromDetailSave>;
10
10
  export declare const updateTransactionDetailEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<ActionType>;
@@ -112,9 +112,12 @@ const updateTransactionDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe
112
112
  }));
113
113
  }
114
114
  }
115
- // Note: no separate updateTransactions needed — updateTransaction above
116
- // already writes under transactionIdResp.id (the full zeni ID), which is
117
- // the same key used by all list-fetch epics.
115
+ // No separate updateTransactions call needed: updateTransaction above
116
+ // writes under transactionIdResp.id (the full zeni ID). This is the same
117
+ // key all list-fetch epics use, so list selectors will read fresh data.
118
+ // ASSUMPTION: toTransactionID(response).id === the transaction_id value
119
+ // that list-fetch epics pass to updateTransactions. If these ever diverge,
120
+ // list rows will go stale after a detail save.
118
121
  const transactionWithCOT = (0, transactionHelper_1.getTransactionWithCOT)(transaction);
119
122
  const pendingReviewLineIds = (0, transactionCategorizationLocalDataHelper_1.getPendingReviewLineIdsFromTransaction)(transactionWithCOT);
120
123
  actions.push((0, transactionsViewReducer_1.syncTransactionCategorizationFromDetailSave)(transactionIdResp, transactionWithCOT, pendingReviewLineIds, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled));
@@ -1 +1 @@
1
- {"version":3,"file":"updateTransactionDetailEpic.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/epics/updateTransactionDetailEpic.ts"],"names":[],"mappings":"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","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toRecommendationPayload} from '../../../commonPayloadTypes/recommendationPayload';\nimport {COTTransactionTracking} from '../../../commonStateTypes/recommendationBase';\nimport {CustomerBase} from '../../../entity/customer/customerState';\nimport {Entity} from '../../../entity/genericEntity/entity';\nimport {openSnackbar} from '../../../entity/snackbar/snackbarReducer';\nimport {toCustomerTransactionPayload} from '../../../entity/transaction/payloadTypes/customerTransactionPayload';\nimport {toTransferTransactionPayload} from '../../../entity/transaction/payloadTypes/otherTransactionPayload';\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {TransactionWithAccountAndClassLinePayload} from '../../../entity/transaction/payloadTypes/transactionLinePayload';\nimport {\n TransactionPayload,\n injectCOTFlagsIntoTransactionPayload,\n toTransactionPayload,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n toVendorTransactionPayload,\n toVendorTransactionWithCustomerPayload,\n} from '../../../entity/transaction/payloadTypes/vendorTransactionPayload';\nimport {\n CustomerTransaction,\n isCustomerTransaction,\n} from '../../../entity/transaction/stateTypes/customerTransaction';\nimport {\n TransferTransaction,\n isTransferTransaction,\n} from '../../../entity/transaction/stateTypes/otherTransaction';\nimport {\n RecommendationByLineId,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {\n LineWithCOTTracking,\n TransactionWithAccountAndClassLineWithCOTTracking,\n} from '../../../entity/transaction/stateTypes/transactionLine';\nimport {\n toJEAndDepositTransactionTypeStrict,\n toVendorTransactionTypeStrict,\n} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n VendorTransaction,\n VendorTransactionWithCustomer,\n isVendorTransaction,\n} from '../../../entity/transaction/stateTypes/vendorTransaction';\nimport toSupportedTransaction from '../../../entity/transaction/toSupportedTransaction';\nimport {getTransactionWithCOT} from '../../../entity/transaction/transactionHelper';\nimport {\n updateTransaction,\n updateTransactions,\n} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {\n SupportedTransaction,\n SupportedTransactionPayload,\n TransactionState,\n} from '../../../entity/transaction/transactionState';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {getVendorByVendorId} from '../../../entity/vendor/vendorSelector';\nimport {VendorBase, VendorState} from '../../../entity/vendor/vendorState';\nimport {RootState} from '../../../reducer';\nimport {\n createZeniAPIStatus,\n isActionNotAllowed,\n isSuccessResponse,\n} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {getPendingReviewLineIdsFromTransaction} from '../../expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';\nimport {syncTransactionCategorizationFromDetailSave} from '../../expenseAutomationView/reducers/transactionsViewReducer';\nimport {EntityRecommendationKey} from '../../recommendation/recommendationState';\nimport {\n EntityRelatedUpdatesPayload,\n TransactionDetailUpdateResponse,\n UpdateTransactionDetailPayload,\n} from '../transactionDetailPayload';\nimport {\n initializeTransactionDetailLocalData,\n markTransactionAsNotMiscategorized,\n updateStatusConsolidatedSaveTransactionDetail,\n updateTransactionDetail,\n updateTransactionDetailSaveStatus,\n updateTransactionStateIfUpdateActionNotAllowed,\n} from '../transactionDetailReducer';\nimport {\n EntityRelatedRecommendationUpdates,\n TransactionDetailState,\n TransactionSaveUpdates,\n TransactionUpdates,\n getTransactionDetailKey,\n} from '../transactionDetailState';\nimport {isTransactionUncategorized} from './saveTransactionHelper';\n\nexport type ActionType =\n | ReturnType<typeof updateTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactions>\n | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed>\n | ReturnType<typeof openSnackbar>\n | ReturnType<typeof updateTransactionDetailSaveStatus>\n | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof markTransactionAsNotMiscategorized>\n | ReturnType<typeof syncTransactionCategorizationFromDetailSave>;\n\nexport const updateTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n) =>\n actions$.pipe(\n filter(updateTransactionDetail.match),\n mergeMap((action) => {\n const {transactionState, vendorState, transactionDetailState} =\n state$.value;\n const {\n cotTransactionTracking,\n transactionId,\n transactionSaveUpdates,\n isUncategorizedExpenseCategoryEnabled,\n } = action.payload;\n return zeniAPI\n .putAndGetJSON<TransactionDetailUpdateResponse>(\n `${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${action.payload.transactionId.id}/categorize`,\n preparePayload(\n transactionState,\n vendorState,\n transactionDetailState,\n transactionId,\n transactionSaveUpdates,\n cotTransactionTracking\n )\n )\n .pipe(\n mergeMap((response) => {\n if (isSuccessResponse(response) && response.data != null) {\n const transactionIdResp = toTransactionID(\n response.data.transaction\n );\n const transactionDetailKeyForResponse =\n getTransactionDetailKey(transactionIdResp);\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKeyForResponse, // detail key is correct for transactionDetailState\n undefined\n );\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n let vendorUpdates: VendorBase | undefined = undefined;\n if (tranVendorUpdates?.qboId != null) {\n const vendor = getVendorByVendorId(\n vendorState,\n tranVendorUpdates.qboId\n );\n if (vendor != null) {\n vendorUpdates = {\n id: vendor?.qboId,\n name: vendor?.name,\n };\n } else if (tranVendorUpdates.name != null) {\n vendorUpdates = {\n id: tranVendorUpdates.qboId,\n name: tranVendorUpdates.name,\n };\n }\n }\n const actions: ActionType[] = [];\n if (response.data.vendors != null) {\n actions.push(updateVendors(response.data.vendors, 'merge'));\n }\n actions.push(\n updateTransaction(\n transactionIdResp.id,\n response.data.transaction\n )\n );\n actions.push(\n initializeTransactionDetailLocalData({\n transactionId: transactionIdResp,\n vendorId: response.data.vendors?.[0]?.vendor_id,\n })\n );\n actions.push(\n updateTransactionDetailSaveStatus(\n transactionIdResp,\n 'Completed'\n )\n );\n let callMarkTransactionAsNotMiscategorized = true;\n // NOTE: If tran is vendorType OR JE OR Deposit transaction and there is no vendor chosen on this tranaction while saving,\n // then we need to skip mark-miscategorized-as-correct api call\n if (\n toVendorTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null ||\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null\n ) {\n const isAnyClassMissing = checkIfClassMissingForAnyLineItem(\n response.data.transaction\n );\n const isVendorOrCustomerMissingInAnyLine =\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null &&\n checkIfVendorOrCustomerMissingForAnyLineItem(\n response.data.transaction\n );\n if (\n (vendorUpdates?.id == null &&\n isVendorOrCustomerMissingInAnyLine == true) ||\n isAnyClassMissing == true\n ) {\n callMarkTransactionAsNotMiscategorized = false;\n }\n }\n\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n\n const transaction = toSupportedTransaction(\n response.data.transaction\n );\n\n const isTransactionUnCategorized = isTransactionUncategorized(\n transaction,\n uncategorizedIncomeExpense\n );\n\n if (\n action.payload.transactionSaveUpdates.markAsMiscatUpdates ===\n true &&\n callMarkTransactionAsNotMiscategorized === true &&\n isTransactionUnCategorized === false\n ) {\n actions.push(\n markTransactionAsNotMiscategorized(\n transactionIdResp,\n action.payload.transactionSaveUpdates,\n action.payload.isExpenseAutomationEnabled\n )\n );\n } else {\n actions.push(\n updateStatusConsolidatedSaveTransactionDetail({\n transactionId: action.payload.transactionId,\n fetchState: 'Completed',\n })\n );\n if (\n action.payload.transactionSaveUpdates.anyBulkUpdates === true\n ) {\n actions.push(\n openSnackbar({\n messageSection:\n 'transactionDetails_updatingPastTransactions',\n messageText: 'success',\n type: 'success',\n })\n );\n } else {\n actions.push(\n openSnackbar({\n messageSection: 'transactionDetails_transactionUpdated',\n messageText: 'success',\n type: 'success',\n })\n );\n }\n }\n\n // Note: no separate updateTransactions needed — updateTransaction above\n // already writes under transactionIdResp.id (the full zeni ID), which is\n // the same key used by all list-fetch epics.\n const transactionWithCOT = getTransactionWithCOT(transaction);\n const pendingReviewLineIds =\n getPendingReviewLineIdsFromTransaction(transactionWithCOT);\n actions.push(\n syncTransactionCategorizationFromDetailSave(\n transactionIdResp,\n transactionWithCOT,\n pendingReviewLineIds,\n uncategorizedIncomeExpense,\n isUncategorizedExpenseCategoryEnabled\n )\n );\n\n return from(actions);\n } else if (isActionNotAllowed(response)) {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n ),\n updateTransactionStateIfUpdateActionNotAllowed({\n transactionId: action.payload.transactionId,\n })\n );\n } else {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) =>\n of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n )\n )\n );\n })\n );\n\nfunction preparePayload(\n transactionState: TransactionState,\n vendorState: VendorState,\n transactionDetailState: TransactionDetailState,\n transactionId: TransactionID,\n saveUpdates: TransactionSaveUpdates,\n cotTransactionTracking: COTTransactionTracking\n): Partial<UpdateTransactionDetailPayload> | undefined {\n const transactionDetailKey = getTransactionDetailKey(transactionId);\n const detail = getSupportedTransactionById(\n transactionState,\n transactionId.id // entity store uses full zeni ID as canonical key\n );\n\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKey,\n undefined\n );\n\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n const tranCustomerUpdates =\n tranDetail?.transactionDetailLocalData.customerUpdates;\n const currentSelectedEntity =\n tranDetail?.transactionDetailLocalData.selectedEntity;\n\n let vendorUpdates: VendorBase | undefined = undefined;\n\n if (\n tranVendorUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'vendor'\n ) {\n const vendor = getVendorByVendorId(vendorState, tranVendorUpdates.qboId);\n const vendorSource = vendor ?? tranVendorUpdates;\n if (vendorSource != null) {\n vendorUpdates = {\n id:\n vendorSource.qboId === vendorSource.name\n ? ''\n : (vendorSource.qboId ?? ''),\n name: vendorSource.name,\n };\n }\n }\n let customerUpdates: CustomerBase | undefined = undefined;\n\n if (\n tranCustomerUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'customer'\n ) {\n customerUpdates = {\n id: tranCustomerUpdates.qboId,\n name: tranCustomerUpdates.name,\n };\n }\n\n if (detail != null) {\n const transUpdates = toTransactionUpdatePayload(\n saveUpdates.updates,\n detail,\n cotTransactionTracking,\n vendorUpdates,\n customerUpdates,\n currentSelectedEntity\n );\n const entityUpdates = toEntityUpdatePayload(\n saveUpdates.entityRelatedUpdates\n );\n return {\n entity_related_updates: entityUpdates,\n transaction_id: transactionId.id,\n transaction: transUpdates,\n };\n }\n return undefined;\n}\n\nconst toTransactionUpdatePayload = (\n updates: TransactionUpdates,\n detail: SupportedTransaction,\n cotTransactionTracking: COTTransactionTracking,\n vendorUpdates?: VendorBase,\n customerUpdates?: CustomerBase,\n tranSelectedEntity?: Entity\n): Partial<TransactionPayload> => {\n const transaction = Object.assign({}, detail);\n transaction.memo = updates.memo ?? '';\n const recommendationUpdates: RecommendationByLineId = {};\n for (const key in updates.updatesByLineId) {\n const lineUpdates = updates.updatesByLineId[key];\n const newLineMap: LineWithCOTTracking[] | undefined =\n transaction.lines?.map((line) => {\n if (line.id === key) {\n const lineTobeUpdated = Object.assign(\n {},\n line\n ) as TransactionWithAccountAndClassLineWithCOTTracking;\n lineTobeUpdated.lineDescription = lineUpdates.lineDescription ?? '';\n if (lineUpdates.class != null) {\n lineTobeUpdated.class = lineUpdates.class;\n }\n if (lineUpdates.account != null) {\n lineTobeUpdated.account = lineUpdates.account;\n }\n\n if (lineUpdates.customer != null) {\n lineTobeUpdated.customer = lineUpdates.customer;\n } else {\n lineTobeUpdated.customer = undefined;\n }\n if (lineUpdates.vendor != null) {\n lineTobeUpdated.vendor = lineUpdates.vendor;\n } else {\n lineTobeUpdated.vendor = undefined;\n }\n\n if (lineUpdates.recommendation != null) {\n recommendationUpdates[line.id] = lineUpdates.recommendation;\n }\n\n // Add COT viewing flags to the line from cotTransactionTracking\n const cotTrackingForLine = cotTransactionTracking?.find(\n (item) => item.lineId === line.id\n );\n\n if (cotTrackingForLine) {\n lineTobeUpdated.cotViewingFlags = {\n vendor: cotTrackingForLine.vendor,\n category: cotTrackingForLine.category,\n class: cotTrackingForLine.class,\n lineId: cotTrackingForLine.lineId,\n };\n }\n\n return lineTobeUpdated;\n }\n return line;\n });\n transaction.lines = newLineMap;\n }\n transaction.recommendations = recommendationUpdates;\n\n // Convert transaction to payload first\n let basePayload: Partial<TransactionPayload>;\n if (isCustomerTransaction(transaction)) {\n basePayload = toCustomerTransactionPayload(\n transaction as CustomerTransaction\n );\n } else if (isVendorTransaction(transaction)) {\n if (tranSelectedEntity != null && tranSelectedEntity.type === 'customer') {\n basePayload = toVendorTransactionWithCustomerPayload(\n transaction as VendorTransactionWithCustomer,\n customerUpdates\n );\n } else {\n basePayload = toVendorTransactionPayload(\n transaction as VendorTransaction,\n vendorUpdates\n );\n }\n } else if (isTransferTransaction(transaction)) {\n basePayload = toTransferTransactionPayload(\n transaction as TransferTransaction\n );\n } else {\n basePayload = toTransactionPayload(transaction);\n }\n\n // Inject COT flags into the payload\n return injectCOTFlagsIntoTransactionPayload(basePayload, transaction);\n};\n\nconst checkIfClassMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyClassMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail?.class\n ?.accounting_class_id == null\n ) {\n isAnyClassMissing = true;\n }\n });\n }\n return isAnyClassMissing;\n};\n\nconst checkIfVendorOrCustomerMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyVendorOrCustomerMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.vendor == null &&\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.customer == null\n ) {\n isAnyVendorOrCustomerMissing = true;\n }\n });\n }\n return isAnyVendorOrCustomerMissing;\n};\n\nconst toEntityUpdatePayload = (\n entityUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >\n) => {\n const entityUpdatesPayload: EntityRelatedUpdatesPayload[] = [];\n\n let entityKey: EntityRecommendationKey;\n for (entityKey in entityUpdates) {\n const entityUpdate = entityUpdates[entityKey];\n const entityUpdatePayload: EntityRelatedUpdatesPayload = {\n recommendations: toRecommendationPayload(entityUpdate.recommendations),\n entity_id: entityUpdate.entityId,\n entity_type: entityUpdate.entityType,\n is_bulk_update: entityUpdate.isBulkUpdate,\n updated_entity_id: entityUpdate.updatedEntityId,\n };\n\n // Add vendor_name if it's a vendor entity and name is provided\n if (\n entityUpdate.entityType === 'vendor' &&\n entityUpdate.vendorName != null\n ) {\n entityUpdatePayload.vendor_name = entityUpdate.vendorName;\n }\n entityUpdatesPayload.push(entityUpdatePayload);\n }\n return entityUpdatesPayload;\n};\n"]}
1
+ {"version":3,"file":"updateTransactionDetailEpic.js","sourceRoot":"","sources":["../../../../src/view/transactionDetail/epics/updateTransactionDetailEpic.ts"],"names":[],"mappings":"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","sourcesContent":["import recordGet from 'lodash/get';\nimport {ActionsObservable, StateObservable} from 'redux-observable';\nimport {from, of} from 'rxjs';\nimport {catchError, filter, mergeMap} from 'rxjs/operators';\n\nimport {toRecommendationPayload} from '../../../commonPayloadTypes/recommendationPayload';\nimport {COTTransactionTracking} from '../../../commonStateTypes/recommendationBase';\nimport {CustomerBase} from '../../../entity/customer/customerState';\nimport {Entity} from '../../../entity/genericEntity/entity';\nimport {openSnackbar} from '../../../entity/snackbar/snackbarReducer';\nimport {toCustomerTransactionPayload} from '../../../entity/transaction/payloadTypes/customerTransactionPayload';\nimport {toTransferTransactionPayload} from '../../../entity/transaction/payloadTypes/otherTransactionPayload';\nimport {toTransactionID} from '../../../entity/transaction/payloadTypes/transactionIDPayload';\nimport {TransactionWithAccountAndClassLinePayload} from '../../../entity/transaction/payloadTypes/transactionLinePayload';\nimport {\n TransactionPayload,\n injectCOTFlagsIntoTransactionPayload,\n toTransactionPayload,\n} from '../../../entity/transaction/payloadTypes/transactionPayload';\nimport {\n toVendorTransactionPayload,\n toVendorTransactionWithCustomerPayload,\n} from '../../../entity/transaction/payloadTypes/vendorTransactionPayload';\nimport {\n CustomerTransaction,\n isCustomerTransaction,\n} from '../../../entity/transaction/stateTypes/customerTransaction';\nimport {\n TransferTransaction,\n isTransferTransaction,\n} from '../../../entity/transaction/stateTypes/otherTransaction';\nimport {\n RecommendationByLineId,\n TransactionID,\n} from '../../../entity/transaction/stateTypes/transaction';\nimport {\n LineWithCOTTracking,\n TransactionWithAccountAndClassLineWithCOTTracking,\n} from '../../../entity/transaction/stateTypes/transactionLine';\nimport {\n toJEAndDepositTransactionTypeStrict,\n toVendorTransactionTypeStrict,\n} from '../../../entity/transaction/stateTypes/transactionType';\nimport {\n VendorTransaction,\n VendorTransactionWithCustomer,\n isVendorTransaction,\n} from '../../../entity/transaction/stateTypes/vendorTransaction';\nimport toSupportedTransaction from '../../../entity/transaction/toSupportedTransaction';\nimport {getTransactionWithCOT} from '../../../entity/transaction/transactionHelper';\nimport {updateTransaction} from '../../../entity/transaction/transactionReducer';\nimport {getSupportedTransactionById} from '../../../entity/transaction/transactionSelector';\nimport {\n SupportedTransaction,\n SupportedTransactionPayload,\n TransactionState,\n} from '../../../entity/transaction/transactionState';\nimport {updateVendors} from '../../../entity/vendor/vendorReducer';\nimport {getVendorByVendorId} from '../../../entity/vendor/vendorSelector';\nimport {VendorBase, VendorState} from '../../../entity/vendor/vendorState';\nimport {RootState} from '../../../reducer';\nimport {\n createZeniAPIStatus,\n isActionNotAllowed,\n isSuccessResponse,\n} from '../../../responsePayload';\nimport {ZeniAPI} from '../../../zeniAPI';\nimport {getUncategorizedAccounts} from '../../accountList/accountListSelector';\nimport {getPendingReviewLineIdsFromTransaction} from '../../expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';\nimport {syncTransactionCategorizationFromDetailSave} from '../../expenseAutomationView/reducers/transactionsViewReducer';\nimport {EntityRecommendationKey} from '../../recommendation/recommendationState';\nimport {\n EntityRelatedUpdatesPayload,\n TransactionDetailUpdateResponse,\n UpdateTransactionDetailPayload,\n} from '../transactionDetailPayload';\nimport {\n initializeTransactionDetailLocalData,\n markTransactionAsNotMiscategorized,\n updateStatusConsolidatedSaveTransactionDetail,\n updateTransactionDetail,\n updateTransactionDetailSaveStatus,\n updateTransactionStateIfUpdateActionNotAllowed,\n} from '../transactionDetailReducer';\nimport {\n EntityRelatedRecommendationUpdates,\n TransactionDetailState,\n TransactionSaveUpdates,\n TransactionUpdates,\n getTransactionDetailKey,\n} from '../transactionDetailState';\nimport {isTransactionUncategorized} from './saveTransactionHelper';\n\nexport type ActionType =\n | ReturnType<typeof updateTransactionDetail>\n | ReturnType<typeof updateTransaction>\n | ReturnType<typeof updateTransactionStateIfUpdateActionNotAllowed>\n | ReturnType<typeof openSnackbar>\n | ReturnType<typeof updateTransactionDetailSaveStatus>\n | ReturnType<typeof updateStatusConsolidatedSaveTransactionDetail>\n | ReturnType<typeof initializeTransactionDetailLocalData>\n | ReturnType<typeof updateVendors>\n | ReturnType<typeof markTransactionAsNotMiscategorized>\n | ReturnType<typeof syncTransactionCategorizationFromDetailSave>;\n\nexport const updateTransactionDetailEpic = (\n actions$: ActionsObservable<ActionType>,\n state$: StateObservable<RootState>,\n zeniAPI: ZeniAPI\n) =>\n actions$.pipe(\n filter(updateTransactionDetail.match),\n mergeMap((action) => {\n const {transactionState, vendorState, transactionDetailState} =\n state$.value;\n const {\n cotTransactionTracking,\n transactionId,\n transactionSaveUpdates,\n isUncategorizedExpenseCategoryEnabled,\n } = action.payload;\n return zeniAPI\n .putAndGetJSON<TransactionDetailUpdateResponse>(\n `${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${action.payload.transactionId.id}/categorize`,\n preparePayload(\n transactionState,\n vendorState,\n transactionDetailState,\n transactionId,\n transactionSaveUpdates,\n cotTransactionTracking\n )\n )\n .pipe(\n mergeMap((response) => {\n if (isSuccessResponse(response) && response.data != null) {\n const transactionIdResp = toTransactionID(\n response.data.transaction\n );\n const transactionDetailKeyForResponse =\n getTransactionDetailKey(transactionIdResp);\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKeyForResponse, // detail key is correct for transactionDetailState\n undefined\n );\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n let vendorUpdates: VendorBase | undefined = undefined;\n if (tranVendorUpdates?.qboId != null) {\n const vendor = getVendorByVendorId(\n vendorState,\n tranVendorUpdates.qboId\n );\n if (vendor != null) {\n vendorUpdates = {\n id: vendor?.qboId,\n name: vendor?.name,\n };\n } else if (tranVendorUpdates.name != null) {\n vendorUpdates = {\n id: tranVendorUpdates.qboId,\n name: tranVendorUpdates.name,\n };\n }\n }\n const actions: ActionType[] = [];\n if (response.data.vendors != null) {\n actions.push(updateVendors(response.data.vendors, 'merge'));\n }\n actions.push(\n updateTransaction(\n transactionIdResp.id,\n response.data.transaction\n )\n );\n actions.push(\n initializeTransactionDetailLocalData({\n transactionId: transactionIdResp,\n vendorId: response.data.vendors?.[0]?.vendor_id,\n })\n );\n actions.push(\n updateTransactionDetailSaveStatus(\n transactionIdResp,\n 'Completed'\n )\n );\n let callMarkTransactionAsNotMiscategorized = true;\n // NOTE: If tran is vendorType OR JE OR Deposit transaction and there is no vendor chosen on this tranaction while saving,\n // then we need to skip mark-miscategorized-as-correct api call\n if (\n toVendorTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null ||\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null\n ) {\n const isAnyClassMissing = checkIfClassMissingForAnyLineItem(\n response.data.transaction\n );\n const isVendorOrCustomerMissingInAnyLine =\n toJEAndDepositTransactionTypeStrict(\n response.data.transaction.transaction_type\n ) != null &&\n checkIfVendorOrCustomerMissingForAnyLineItem(\n response.data.transaction\n );\n if (\n (vendorUpdates?.id == null &&\n isVendorOrCustomerMissingInAnyLine == true) ||\n isAnyClassMissing == true\n ) {\n callMarkTransactionAsNotMiscategorized = false;\n }\n }\n\n const uncategorizedIncomeExpense = getUncategorizedAccounts(\n state$.value.accountState,\n state$.value.accountListState,\n 'accountList'\n );\n\n const transaction = toSupportedTransaction(\n response.data.transaction\n );\n\n const isTransactionUnCategorized = isTransactionUncategorized(\n transaction,\n uncategorizedIncomeExpense\n );\n\n if (\n action.payload.transactionSaveUpdates.markAsMiscatUpdates ===\n true &&\n callMarkTransactionAsNotMiscategorized === true &&\n isTransactionUnCategorized === false\n ) {\n actions.push(\n markTransactionAsNotMiscategorized(\n transactionIdResp,\n action.payload.transactionSaveUpdates,\n action.payload.isExpenseAutomationEnabled\n )\n );\n } else {\n actions.push(\n updateStatusConsolidatedSaveTransactionDetail({\n transactionId: action.payload.transactionId,\n fetchState: 'Completed',\n })\n );\n if (\n action.payload.transactionSaveUpdates.anyBulkUpdates === true\n ) {\n actions.push(\n openSnackbar({\n messageSection:\n 'transactionDetails_updatingPastTransactions',\n messageText: 'success',\n type: 'success',\n })\n );\n } else {\n actions.push(\n openSnackbar({\n messageSection: 'transactionDetails_transactionUpdated',\n messageText: 'success',\n type: 'success',\n })\n );\n }\n }\n\n // No separate updateTransactions call needed: updateTransaction above\n // writes under transactionIdResp.id (the full zeni ID). This is the same\n // key all list-fetch epics use, so list selectors will read fresh data.\n // ASSUMPTION: toTransactionID(response).id === the transaction_id value\n // that list-fetch epics pass to updateTransactions. If these ever diverge,\n // list rows will go stale after a detail save.\n const transactionWithCOT = getTransactionWithCOT(transaction);\n const pendingReviewLineIds =\n getPendingReviewLineIdsFromTransaction(transactionWithCOT);\n actions.push(\n syncTransactionCategorizationFromDetailSave(\n transactionIdResp,\n transactionWithCOT,\n pendingReviewLineIds,\n uncategorizedIncomeExpense,\n isUncategorizedExpenseCategoryEnabled\n )\n );\n\n return from(actions);\n } else if (isActionNotAllowed(response)) {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n ),\n updateTransactionStateIfUpdateActionNotAllowed({\n transactionId: action.payload.transactionId,\n })\n );\n } else {\n return of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n response.status\n )\n );\n }\n }),\n catchError((error) =>\n of(\n updateTransactionDetailSaveStatus(\n action.payload.transactionId,\n 'Error',\n createZeniAPIStatus(\n 'Unexpected Error',\n `REST API call errored out ${error}`\n )\n )\n )\n )\n );\n })\n );\n\nfunction preparePayload(\n transactionState: TransactionState,\n vendorState: VendorState,\n transactionDetailState: TransactionDetailState,\n transactionId: TransactionID,\n saveUpdates: TransactionSaveUpdates,\n cotTransactionTracking: COTTransactionTracking\n): Partial<UpdateTransactionDetailPayload> | undefined {\n const transactionDetailKey = getTransactionDetailKey(transactionId);\n const detail = getSupportedTransactionById(\n transactionState,\n transactionId.id // entity store uses full zeni ID as canonical key\n );\n\n const tranDetail = recordGet(\n transactionDetailState.transactionDetailById,\n transactionDetailKey,\n undefined\n );\n\n const tranVendorUpdates =\n tranDetail?.transactionDetailLocalData.vendorUpdates;\n const tranCustomerUpdates =\n tranDetail?.transactionDetailLocalData.customerUpdates;\n const currentSelectedEntity =\n tranDetail?.transactionDetailLocalData.selectedEntity;\n\n let vendorUpdates: VendorBase | undefined = undefined;\n\n if (\n tranVendorUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'vendor'\n ) {\n const vendor = getVendorByVendorId(vendorState, tranVendorUpdates.qboId);\n const vendorSource = vendor ?? tranVendorUpdates;\n if (vendorSource != null) {\n vendorUpdates = {\n id:\n vendorSource.qboId === vendorSource.name\n ? ''\n : (vendorSource.qboId ?? ''),\n name: vendorSource.name,\n };\n }\n }\n let customerUpdates: CustomerBase | undefined = undefined;\n\n if (\n tranCustomerUpdates?.qboId != null &&\n currentSelectedEntity != null &&\n currentSelectedEntity.type === 'customer'\n ) {\n customerUpdates = {\n id: tranCustomerUpdates.qboId,\n name: tranCustomerUpdates.name,\n };\n }\n\n if (detail != null) {\n const transUpdates = toTransactionUpdatePayload(\n saveUpdates.updates,\n detail,\n cotTransactionTracking,\n vendorUpdates,\n customerUpdates,\n currentSelectedEntity\n );\n const entityUpdates = toEntityUpdatePayload(\n saveUpdates.entityRelatedUpdates\n );\n return {\n entity_related_updates: entityUpdates,\n transaction_id: transactionId.id,\n transaction: transUpdates,\n };\n }\n return undefined;\n}\n\nconst toTransactionUpdatePayload = (\n updates: TransactionUpdates,\n detail: SupportedTransaction,\n cotTransactionTracking: COTTransactionTracking,\n vendorUpdates?: VendorBase,\n customerUpdates?: CustomerBase,\n tranSelectedEntity?: Entity\n): Partial<TransactionPayload> => {\n const transaction = Object.assign({}, detail);\n transaction.memo = updates.memo ?? '';\n const recommendationUpdates: RecommendationByLineId = {};\n for (const key in updates.updatesByLineId) {\n const lineUpdates = updates.updatesByLineId[key];\n const newLineMap: LineWithCOTTracking[] | undefined =\n transaction.lines?.map((line) => {\n if (line.id === key) {\n const lineTobeUpdated = Object.assign(\n {},\n line\n ) as TransactionWithAccountAndClassLineWithCOTTracking;\n lineTobeUpdated.lineDescription = lineUpdates.lineDescription ?? '';\n if (lineUpdates.class != null) {\n lineTobeUpdated.class = lineUpdates.class;\n }\n if (lineUpdates.account != null) {\n lineTobeUpdated.account = lineUpdates.account;\n }\n\n if (lineUpdates.customer != null) {\n lineTobeUpdated.customer = lineUpdates.customer;\n } else {\n lineTobeUpdated.customer = undefined;\n }\n if (lineUpdates.vendor != null) {\n lineTobeUpdated.vendor = lineUpdates.vendor;\n } else {\n lineTobeUpdated.vendor = undefined;\n }\n\n if (lineUpdates.recommendation != null) {\n recommendationUpdates[line.id] = lineUpdates.recommendation;\n }\n\n // Add COT viewing flags to the line from cotTransactionTracking\n const cotTrackingForLine = cotTransactionTracking?.find(\n (item) => item.lineId === line.id\n );\n\n if (cotTrackingForLine) {\n lineTobeUpdated.cotViewingFlags = {\n vendor: cotTrackingForLine.vendor,\n category: cotTrackingForLine.category,\n class: cotTrackingForLine.class,\n lineId: cotTrackingForLine.lineId,\n };\n }\n\n return lineTobeUpdated;\n }\n return line;\n });\n transaction.lines = newLineMap;\n }\n transaction.recommendations = recommendationUpdates;\n\n // Convert transaction to payload first\n let basePayload: Partial<TransactionPayload>;\n if (isCustomerTransaction(transaction)) {\n basePayload = toCustomerTransactionPayload(\n transaction as CustomerTransaction\n );\n } else if (isVendorTransaction(transaction)) {\n if (tranSelectedEntity != null && tranSelectedEntity.type === 'customer') {\n basePayload = toVendorTransactionWithCustomerPayload(\n transaction as VendorTransactionWithCustomer,\n customerUpdates\n );\n } else {\n basePayload = toVendorTransactionPayload(\n transaction as VendorTransaction,\n vendorUpdates\n );\n }\n } else if (isTransferTransaction(transaction)) {\n basePayload = toTransferTransactionPayload(\n transaction as TransferTransaction\n );\n } else {\n basePayload = toTransactionPayload(transaction);\n }\n\n // Inject COT flags into the payload\n return injectCOTFlagsIntoTransactionPayload(basePayload, transaction);\n};\n\nconst checkIfClassMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyClassMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail?.class\n ?.accounting_class_id == null\n ) {\n isAnyClassMissing = true;\n }\n });\n }\n return isAnyClassMissing;\n};\n\nconst checkIfVendorOrCustomerMissingForAnyLineItem = (\n transactionPayload: SupportedTransactionPayload\n): boolean => {\n let isAnyVendorOrCustomerMissing = false;\n if (transactionPayload.lines != null) {\n transactionPayload.lines.forEach((line) => {\n if (\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.vendor == null &&\n (line as TransactionWithAccountAndClassLinePayload).line_detail\n ?.customer == null\n ) {\n isAnyVendorOrCustomerMissing = true;\n }\n });\n }\n return isAnyVendorOrCustomerMissing;\n};\n\nconst toEntityUpdatePayload = (\n entityUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >\n) => {\n const entityUpdatesPayload: EntityRelatedUpdatesPayload[] = [];\n\n let entityKey: EntityRecommendationKey;\n for (entityKey in entityUpdates) {\n const entityUpdate = entityUpdates[entityKey];\n const entityUpdatePayload: EntityRelatedUpdatesPayload = {\n recommendations: toRecommendationPayload(entityUpdate.recommendations),\n entity_id: entityUpdate.entityId,\n entity_type: entityUpdate.entityType,\n is_bulk_update: entityUpdate.isBulkUpdate,\n updated_entity_id: entityUpdate.updatedEntityId,\n };\n\n // Add vendor_name if it's a vendor entity and name is provided\n if (\n entityUpdate.entityType === 'vendor' &&\n entityUpdate.vendorName != null\n ) {\n entityUpdatePayload.vendor_name = entityUpdate.vendorName;\n }\n entityUpdatesPayload.push(entityUpdatePayload);\n }\n return entityUpdatesPayload;\n};\n"]}
@@ -11,7 +11,7 @@ import { TransactionDetailLocalData } from './transactionDetailTypes';
11
11
  export declare const getTransactionDetailKey: (transactionId: TransactionID) => `${string}_bill` | `${string}_expense` | `${string}_check` | `${string}_refund` | `${string}_invoice` | `${string}_payment` | `${string}_credit_memo` | `${string}_sales_receipt` | `${string}_delayed_credit` | `${string}_delayed_charge` | `${string}_bill_payment` | `${string}_bill_payment_check` | `${string}_bill_payment_credit_card` | `${string}_vendor_credit` | `${string}_credit_card_credit` | `${string}_transfer` | `${string}_credit_card_payment` | `${string}_deposit` | `${string}_journal_entry`;
12
12
  export type TransactionDetailKey = ReturnType<typeof getTransactionDetailKey>;
13
13
  export declare const getZeniTransactionDetailKey: (transactionId: TransactionID) => `${string}_bill` | `${string}_expense` | `${string}_check` | `${string}_refund` | `${string}_invoice` | `${string}_payment` | `${string}_credit_memo` | `${string}_sales_receipt` | `${string}_delayed_credit` | `${string}_delayed_charge` | `${string}_bill_payment` | `${string}_bill_payment_check` | `${string}_bill_payment_credit_card` | `${string}_vendor_credit` | `${string}_credit_card_credit` | `${string}_transfer` | `${string}_credit_card_payment` | `${string}_deposit` | `${string}_journal_entry`;
14
- export type ZeniTransactionDetailKey = ReturnType<typeof getTransactionDetailKey>;
14
+ export type ZeniTransactionDetailKey = ReturnType<typeof getZeniTransactionDetailKey>;
15
15
  export declare const getThirdPartyIdFromTransactionId: (transactionId: TransactionID) => string;
16
16
  /**
17
17
  * Returns actual QBO transaction ID.
@@ -2,10 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.initialSupportedTransactionDetail = exports.getActualTransactionID = exports.getThirdPartyIdFromTransactionId = exports.getZeniTransactionDetailKey = exports.getTransactionDetailKey = void 0;
4
4
  exports.getAllLinkedTransactions = getAllLinkedTransactions;
5
- // This transaction key only extracts the third party ID and uses that
6
- // for the ID
5
+ // TWO-KEY SYSTEM — read before touching transaction lookups:
6
+ //
7
+ // 1. transactionDetailState.transactionDetailById → keyed by getTransactionDetailKey()
8
+ // Format: "<qbo_id>_<type>" (strips the "tran_<uuid>:" prefix)
9
+ // Used by: all transactionDetail epics/selectors for detail metadata (fetch state, local data, etc.)
10
+ //
11
+ // 2. transactionState.transactionById → keyed by transactionId.id (full zeni ID, e.g. "tran_<uuid>:<qbo_id>")
12
+ // Used by: all list-fetch epics, getSupportedTransactionById, and all entity store reads/writes
13
+ //
14
+ // IMPORTANT: Never use getTransactionDetailKey() to look up or remove from transactionState.
15
+ // Always use transactionId.id for the entity store.
16
+ // Produces the transactionDetailState key: "<qbo_id>_<type>"
7
17
  const getTransactionDetailKey = (transactionId) => `${(0, exports.getActualTransactionID)(transactionId.id)}_${transactionId.type}`;
8
18
  exports.getTransactionDetailKey = getTransactionDetailKey;
19
+ // Produces the full-zeni-ID-based key: "<tran_uuid:qbo_id>_<type>"
20
+ // Note: this key format is not used by the entity store (which uses transactionId.id directly).
9
21
  const getZeniTransactionDetailKey = (transactionId) => `${transactionId.id}_${transactionId.type}`;
10
22
  exports.getZeniTransactionDetailKey = getZeniTransactionDetailKey;
11
23
  const getThirdPartyIdFromTransactionId = (transactionId) => {
@@ -1 +1 @@
1
- {"version":3,"file":"transactionDetailState.js","sourceRoot":"","sources":["../../../src/view/transactionDetail/transactionDetailState.ts"],"names":[],"mappings":";;;AAwDA,4DAiBC;AArDD,sEAAsE;AACtE,aAAa;AACN,MAAM,uBAAuB,GAAG,CAAC,aAA4B,EAAE,EAAE,CACtE,GAAG,IAAA,8BAAsB,EAAC,aAAa,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,EAAW,CAAC;AADlE,QAAA,uBAAuB,2BAC2C;AAIxE,MAAM,2BAA2B,GAAG,CAAC,aAA4B,EAAE,EAAE,CAC1E,GAAG,aAAa,CAAC,EAAE,IAAI,aAAa,CAAC,IAAI,EAAW,CAAC;AAD1C,QAAA,2BAA2B,+BACe;AAMhD,MAAM,gCAAgC,GAAG,CAC9C,aAA4B,EACpB,EAAE;IACV,MAAM,eAAe,GAAG,aAAa,CAAC,EAAE,CAAC;IACzC,OAAO,IAAA,8BAAsB,EAAC,eAAe,CAAC,CAAC;AACjD,CAAC,CAAC;AALW,QAAA,gCAAgC,oCAK3C;AAEF;;;;;GAKG;AACI,MAAM,sBAAsB,GAAG,CAAC,eAAuB,EAAE,EAAE;IAChE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,sBAAsB,0BAOjC;AAEF,SAAgB,wBAAwB,CACtC,WAAwB;IAExB,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CACxD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC/B,CAAC;IACF,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC3C,IAA8B,CAAC,kBAAkB,CAAC,GAAG,CACpD,CAAC,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CACtD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAqBY,QAAA,iCAAiC,GAA+B;IAC3E,4BAA4B,EAAE,EAAE;IAChC,UAAU,EAAE,aAAa;IACzB,KAAK,EAAE,SAAS;IAChB,aAAa,EAAE,SAAS;IACxB,6BAA6B,EAAE;QAC7B,sBAAsB,EAAE,aAAa;QACrC,UAAU,EAAE;YACV,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,gBAAgB,EAAE;YAChB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,0BAA0B,EAAE;YAC1B,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;QACD,qBAAqB,EAAE;YACrB,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;KACF;IACD,0BAA0B,EAAE;QAC1B,YAAY,EAAE,EAAE;QAChB,wBAAwB,EAAE,KAAK;QAC/B,uDAAuD,EAAE;YACvD,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,SAAS;SACjB;KACF;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC;IACzC,CAAC;CACF,CAAC","sourcesContent":["import {\n FetchState,\n FetchStateAndError,\n FetchedState,\n ID,\n} from '../../commonStateTypes/common';\nimport {Recommendation} from '../../commonStateTypes/recommendationBase';\nimport {AccountBase} from '../../entity/account/accountState';\nimport {ClassBase} from '../../entity/class/classState';\nimport {CustomerBase} from '../../entity/customer/customerState';\nimport {EntityType} from '../../entity/genericEntity/entity';\nimport {\n Transaction,\n TransactionID,\n} from '../../entity/transaction/stateTypes/transaction';\nimport {LinkedTransactionLine} from '../../entity/transaction/stateTypes/transactionLine';\nimport {VendorBase} from '../../entity/vendor/vendorState';\nimport {EntityRecommendationKey} from '../recommendation/recommendationState';\nimport {TransactionDetailLocalData} from './transactionDetailTypes';\n\n// This transaction key only extracts the third party ID and uses that\n// for the ID\nexport const getTransactionDetailKey = (transactionId: TransactionID) =>\n `${getActualTransactionID(transactionId.id)}_${transactionId.type}` as const;\n\nexport type TransactionDetailKey = ReturnType<typeof getTransactionDetailKey>;\n\nexport const getZeniTransactionDetailKey = (transactionId: TransactionID) =>\n `${transactionId.id}_${transactionId.type}` as const;\n\nexport type ZeniTransactionDetailKey = ReturnType<\n typeof getTransactionDetailKey\n>;\n\nexport const getThirdPartyIdFromTransactionId = (\n transactionId: TransactionID\n): string => {\n const zeniGeneratedId = transactionId.id;\n return getActualTransactionID(zeniGeneratedId);\n};\n\n/**\n * Returns actual QBO transaction ID.\n * @param zeniGeneratedId zeni transaciton Id in the form of tran_<uuid>:<qbo_id>\n * @returns retruns the actual QBO transaction Id.\n * @note in case if the given transaction id itself is QBO id, the it just passes it back.\n */\nexport const getActualTransactionID = (zeniGeneratedId: string) => {\n const splittedIds = zeniGeneratedId.trim().split(':');\n if (splittedIds.length === 1) {\n return splittedIds[0];\n } else {\n return splittedIds[1];\n }\n};\n\nexport function getAllLinkedTransactions(\n transaction: Transaction\n): TransactionID[] {\n const result: TransactionID[] = [];\n\n transaction.linkedTransactions?.map((linkedTransaction) =>\n result.push(linkedTransaction)\n );\n transaction.lines?.map((line) => {\n if (line.type === 'linked_transaction_line') {\n (line as LinkedTransactionLine).linkedTransactions.map(\n (linkedTransaction) => result.push(linkedTransaction)\n );\n }\n });\n\n return result;\n}\n\nexport interface SupportedTransactionDetail extends FetchedState {\n //This will be unique as it is based on timestamp\n deleteStatusByAttachmentName: Record<string, FetchStateAndError>;\n transactionDetailLocalData: TransactionDetailLocalData;\n transactionDetailUpdateStatus: {\n bulkUpdateStatus: FetchStateAndError;\n consolidatedFetchState: FetchState;\n markAsNotMiscatStatus: FetchStateAndError;\n recommendationUpdateStatus: FetchStateAndError;\n saveStatus: FetchStateAndError;\n };\n attachments?: AccountingProviderAttachment;\n isUpdateNotAllowed?: boolean;\n transactionId?: TransactionID;\n}\ninterface AccountingProviderAttachment {\n blobs: [];\n fetchState: FetchStateAndError;\n}\nexport const initialSupportedTransactionDetail: SupportedTransactionDetail = {\n deleteStatusByAttachmentName: {},\n fetchState: 'Not-Started',\n error: undefined,\n transactionId: undefined,\n transactionDetailUpdateStatus: {\n consolidatedFetchState: 'Not-Started',\n saveStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n bulkUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n recommendationUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n markAsNotMiscatStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n transactionDetailLocalData: {\n lineItemById: {},\n isVendorUpdateAllChecked: false,\n vendorBulkUpdateCategoryClassRecommendationsFetchStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n\n hasValidState() {\n return this.fetchState === 'Completed';\n },\n};\n\nexport interface TransactionDetailState {\n accountingProviderAttachment: {\n attachmentDataByID: Record<ID, ArrayBuffer>;\n fetchState: FetchState;\n };\n\n transactionDetailById: Record<\n TransactionDetailKey,\n SupportedTransactionDetail | undefined\n >;\n}\n\nexport interface TransactionLineUpdates {\n account?: AccountBase;\n class?: ClassBase;\n customer?: CustomerBase;\n lineDescription?: string;\n recommendation?: Recommendation[];\n vendor?: VendorBase;\n}\n\nexport interface TransactionUpdates {\n updatesByLineId: Record<ID, TransactionLineUpdates>;\n customerId?: ID;\n memo?: string;\n vendorId?: ID;\n}\n\nexport interface EntityRelatedRecommendationUpdates {\n entityId: ID | null; // null indicates vendor/customer should be created on the fly\n entityType: EntityType;\n isBulkUpdate: boolean;\n recommendations: Recommendation;\n updatedEntityId: ID | undefined;\n vendorName?: string; // Required when entityId is null and entityType is 'vendor'\n}\n\nexport interface TransactionSaveUpdates {\n anyBulkUpdates: boolean; // If there is any bulk update to be done, then this will be true\n entityRelatedUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >;\n markAsMiscatUpdates: boolean;\n updates: TransactionUpdates;\n}\n"]}
1
+ {"version":3,"file":"transactionDetailState.js","sourceRoot":"","sources":["../../../src/view/transactionDetail/transactionDetailState.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FetchState,\n FetchStateAndError,\n FetchedState,\n ID,\n} from '../../commonStateTypes/common';\nimport {Recommendation} from '../../commonStateTypes/recommendationBase';\nimport {AccountBase} from '../../entity/account/accountState';\nimport {ClassBase} from '../../entity/class/classState';\nimport {CustomerBase} from '../../entity/customer/customerState';\nimport {EntityType} from '../../entity/genericEntity/entity';\nimport {\n Transaction,\n TransactionID,\n} from '../../entity/transaction/stateTypes/transaction';\nimport {LinkedTransactionLine} from '../../entity/transaction/stateTypes/transactionLine';\nimport {VendorBase} from '../../entity/vendor/vendorState';\nimport {EntityRecommendationKey} from '../recommendation/recommendationState';\nimport {TransactionDetailLocalData} from './transactionDetailTypes';\n\n// TWO-KEY SYSTEM — read before touching transaction lookups:\n//\n// 1. transactionDetailState.transactionDetailById → keyed by getTransactionDetailKey()\n// Format: \"<qbo_id>_<type>\" (strips the \"tran_<uuid>:\" prefix)\n// Used by: all transactionDetail epics/selectors for detail metadata (fetch state, local data, etc.)\n//\n// 2. transactionState.transactionById → keyed by transactionId.id (full zeni ID, e.g. \"tran_<uuid>:<qbo_id>\")\n// Used by: all list-fetch epics, getSupportedTransactionById, and all entity store reads/writes\n//\n// IMPORTANT: Never use getTransactionDetailKey() to look up or remove from transactionState.\n// Always use transactionId.id for the entity store.\n\n// Produces the transactionDetailState key: \"<qbo_id>_<type>\"\nexport const getTransactionDetailKey = (transactionId: TransactionID) =>\n `${getActualTransactionID(transactionId.id)}_${transactionId.type}` as const;\n\nexport type TransactionDetailKey = ReturnType<typeof getTransactionDetailKey>;\n\n// Produces the full-zeni-ID-based key: \"<tran_uuid:qbo_id>_<type>\"\n// Note: this key format is not used by the entity store (which uses transactionId.id directly).\nexport const getZeniTransactionDetailKey = (transactionId: TransactionID) =>\n `${transactionId.id}_${transactionId.type}` as const;\n\n// Fixed: was previously (incorrectly) typed as ReturnType<typeof getTransactionDetailKey>\nexport type ZeniTransactionDetailKey = ReturnType<\n typeof getZeniTransactionDetailKey\n>;\n\nexport const getThirdPartyIdFromTransactionId = (\n transactionId: TransactionID\n): string => {\n const zeniGeneratedId = transactionId.id;\n return getActualTransactionID(zeniGeneratedId);\n};\n\n/**\n * Returns actual QBO transaction ID.\n * @param zeniGeneratedId zeni transaciton Id in the form of tran_<uuid>:<qbo_id>\n * @returns retruns the actual QBO transaction Id.\n * @note in case if the given transaction id itself is QBO id, the it just passes it back.\n */\nexport const getActualTransactionID = (zeniGeneratedId: string) => {\n const splittedIds = zeniGeneratedId.trim().split(':');\n if (splittedIds.length === 1) {\n return splittedIds[0];\n } else {\n return splittedIds[1];\n }\n};\n\nexport function getAllLinkedTransactions(\n transaction: Transaction\n): TransactionID[] {\n const result: TransactionID[] = [];\n\n transaction.linkedTransactions?.map((linkedTransaction) =>\n result.push(linkedTransaction)\n );\n transaction.lines?.map((line) => {\n if (line.type === 'linked_transaction_line') {\n (line as LinkedTransactionLine).linkedTransactions.map(\n (linkedTransaction) => result.push(linkedTransaction)\n );\n }\n });\n\n return result;\n}\n\nexport interface SupportedTransactionDetail extends FetchedState {\n //This will be unique as it is based on timestamp\n deleteStatusByAttachmentName: Record<string, FetchStateAndError>;\n transactionDetailLocalData: TransactionDetailLocalData;\n transactionDetailUpdateStatus: {\n bulkUpdateStatus: FetchStateAndError;\n consolidatedFetchState: FetchState;\n markAsNotMiscatStatus: FetchStateAndError;\n recommendationUpdateStatus: FetchStateAndError;\n saveStatus: FetchStateAndError;\n };\n attachments?: AccountingProviderAttachment;\n isUpdateNotAllowed?: boolean;\n transactionId?: TransactionID;\n}\ninterface AccountingProviderAttachment {\n blobs: [];\n fetchState: FetchStateAndError;\n}\nexport const initialSupportedTransactionDetail: SupportedTransactionDetail = {\n deleteStatusByAttachmentName: {},\n fetchState: 'Not-Started',\n error: undefined,\n transactionId: undefined,\n transactionDetailUpdateStatus: {\n consolidatedFetchState: 'Not-Started',\n saveStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n bulkUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n recommendationUpdateStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n markAsNotMiscatStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n transactionDetailLocalData: {\n lineItemById: {},\n isVendorUpdateAllChecked: false,\n vendorBulkUpdateCategoryClassRecommendationsFetchStatus: {\n fetchState: 'Not-Started',\n error: undefined,\n },\n },\n\n hasValidState() {\n return this.fetchState === 'Completed';\n },\n};\n\nexport interface TransactionDetailState {\n accountingProviderAttachment: {\n attachmentDataByID: Record<ID, ArrayBuffer>;\n fetchState: FetchState;\n };\n\n transactionDetailById: Record<\n TransactionDetailKey,\n SupportedTransactionDetail | undefined\n >;\n}\n\nexport interface TransactionLineUpdates {\n account?: AccountBase;\n class?: ClassBase;\n customer?: CustomerBase;\n lineDescription?: string;\n recommendation?: Recommendation[];\n vendor?: VendorBase;\n}\n\nexport interface TransactionUpdates {\n updatesByLineId: Record<ID, TransactionLineUpdates>;\n customerId?: ID;\n memo?: string;\n vendorId?: ID;\n}\n\nexport interface EntityRelatedRecommendationUpdates {\n entityId: ID | null; // null indicates vendor/customer should be created on the fly\n entityType: EntityType;\n isBulkUpdate: boolean;\n recommendations: Recommendation;\n updatedEntityId: ID | undefined;\n vendorName?: string; // Required when entityId is null and entityType is 'vendor'\n}\n\nexport interface TransactionSaveUpdates {\n anyBulkUpdates: boolean; // If there is any bulk update to be done, then this will be true\n entityRelatedUpdates: Record<\n EntityRecommendationKey,\n EntityRelatedRecommendationUpdates\n >;\n markAsMiscatUpdates: boolean;\n updates: TransactionUpdates;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "4.19.77-betaAK4",
3
+ "version": "4.19.77-betaAK6",
4
4
  "description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",
@@ -33,6 +33,34 @@
33
33
  "require": "./lib/view/*.js"
34
34
  }
35
35
  },
36
+ "scripts": {
37
+ "clean": "rimraf lib",
38
+ "test:typecheck": "echo 'Typechecking test files...' && time tsc -p tsconfig.typecheck.json",
39
+ "test": "pnpm test:typecheck && vitest run --typecheck",
40
+ "lint": "eslint . --ext .js,.jsx,.ts,.tsx --fix",
41
+ "find-dead-code": "ts-prune | grep -v '(used in module)'",
42
+ "find-unused-exports": "ts-unused-exports ./tsconfig.json",
43
+ "circular-dependency": "npx madge --circular --extensions ts ./src",
44
+ "build": "concurrently --kill-others-on-fail --handle-input \"echo 'Running ESLint...' && eslint . --ext .js,.jsx,.ts,.tsx\" \"echo 'TypeScript build in progress...' && time tsc && echo 'ESM build...' && tsc -p tsconfig.esm.json\" \"echo 'Running tests and typecheck...' && pnpm test\" && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
45
+ "only-build": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc && tsc -p tsconfig.esm.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
46
+ "only-build-dev": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc -p tsconfig.dev.json && tsc -p tsconfig.esm.dev.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
47
+ "format": "prettier --write --ignore-unknown \"src/**/*\" && pnpm lint",
48
+ "format-watch": "(git diff --name-only --diff-filter=ACM && git ls-files --others --exclude-standard) | grep -E '\\.(ts|tsx)$' | xargs prettier --write",
49
+ "check-version": "node ./scripts/check_version.js",
50
+ "prepublishOnly": "chmod +x ./scripts/branch_validation.sh && ./scripts/branch_validation.sh && pnpm update-slack-group-topic && pnpm run check-version && pnpm clean && pnpm build",
51
+ "version": "git add -A src",
52
+ "postversion": "git push && git push --tags",
53
+ "check-dependencies": "node ./scripts/check_dependencies.js",
54
+ "clean-overrides": "node ./scripts/clean_overrides.js",
55
+ "create-release-branch": "chmod +x ./scripts/create_release_branch.sh && ./scripts/create_release_branch.sh",
56
+ "bump-update-web-app-cockpit-beta": "chmod +x ./scripts/bump_and_update_web_app_ui_beta.sh && ./scripts/bump_and_update_web_app_ui_beta.sh",
57
+ "send-release-notes": "chmod +x ./scripts/send_release_notes.sh && ./scripts/send_release_notes.sh",
58
+ "update-slack-group-topic": "chmod +x ./scripts/update-slack-group-topic.sh && ./scripts/update-slack-group-topic.sh",
59
+ "build-beta-and-copy": "chmod +x ./scripts/build_and_copy.sh && ./scripts/build_and_copy.sh",
60
+ "pr-approvals-update": "chmod +x ./scripts/pr_approvals.sh && ./scripts/pr_approvals.sh",
61
+ "raise-pr-automation": "chmod +x ./scripts/raise_pr_automation.sh && ./scripts/raise_pr_automation.sh",
62
+ "test:file": "scripts/test-file.sh"
63
+ },
36
64
  "files": [
37
65
  "lib/**/*"
38
66
  ],
@@ -103,31 +131,29 @@
103
131
  "dayjs": "^1.10.7",
104
132
  "url-parse": "^1.5.10"
105
133
  },
106
- "scripts": {
107
- "clean": "rimraf lib",
108
- "test:typecheck": "echo 'Typechecking test files...' && time tsc -p tsconfig.typecheck.json",
109
- "test": "pnpm test:typecheck && vitest run --typecheck",
110
- "lint": "eslint . --ext .js,.jsx,.ts,.tsx --fix",
111
- "find-dead-code": "ts-prune | grep -v '(used in module)'",
112
- "find-unused-exports": "ts-unused-exports ./tsconfig.json",
113
- "circular-dependency": "npx madge --circular --extensions ts ./src",
114
- "build": "concurrently --kill-others-on-fail --handle-input \"echo 'Running ESLint...' && eslint . --ext .js,.jsx,.ts,.tsx\" \"echo 'TypeScript build in progress...' && time tsc && echo 'ESM build...' && tsc -p tsconfig.esm.json\" \"echo 'Running tests and typecheck...' && pnpm test\" && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
115
- "only-build": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc && tsc -p tsconfig.esm.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
116
- "only-build-dev": "eslint . --ext .js,.jsx,.ts,.tsx && time tsc -p tsconfig.dev.json && tsc -p tsconfig.esm.dev.json && rimraf \"lib/**/__mocks__\" \"lib/**/__testHelpers__\"",
117
- "format": "prettier --write --ignore-unknown \"src/**/*\" && pnpm lint",
118
- "format-watch": "(git diff --name-only --diff-filter=ACM && git ls-files --others --exclude-standard) | grep -E '\\.(ts|tsx)$' | xargs prettier --write",
119
- "check-version": "node ./scripts/check_version.js",
120
- "version": "git add -A src",
121
- "postversion": "git push && git push --tags",
122
- "check-dependencies": "node ./scripts/check_dependencies.js",
123
- "clean-overrides": "node ./scripts/clean_overrides.js",
124
- "create-release-branch": "chmod +x ./scripts/create_release_branch.sh && ./scripts/create_release_branch.sh",
125
- "bump-update-web-app-cockpit-beta": "chmod +x ./scripts/bump_and_update_web_app_ui_beta.sh && ./scripts/bump_and_update_web_app_ui_beta.sh",
126
- "send-release-notes": "chmod +x ./scripts/send_release_notes.sh && ./scripts/send_release_notes.sh",
127
- "update-slack-group-topic": "chmod +x ./scripts/update-slack-group-topic.sh && ./scripts/update-slack-group-topic.sh",
128
- "build-beta-and-copy": "chmod +x ./scripts/build_and_copy.sh && ./scripts/build_and_copy.sh",
129
- "pr-approvals-update": "chmod +x ./scripts/pr_approvals.sh && ./scripts/pr_approvals.sh",
130
- "raise-pr-automation": "chmod +x ./scripts/raise_pr_automation.sh && ./scripts/raise_pr_automation.sh",
131
- "test:file": "scripts/test-file.sh"
134
+ "pnpm": {
135
+ "overrides": {
136
+ "@babel/helpers": ">=7.26.10",
137
+ "@babel/runtime": ">=7.26.10",
138
+ "@babel/traverse": ">=7.23.2",
139
+ "@eslint/eslintrc>ajv": ">=6.14.0 <7",
140
+ "@eslint/plugin-kit": ">=0.3.4",
141
+ "@modelcontextprotocol/sdk": ">=1.25.2",
142
+ "ajv": ">=8.18.0",
143
+ "body-parser": ">=2.2.1",
144
+ "brace-expansion": ">=5.0.2",
145
+ "cross-spawn": ">=7.0.5",
146
+ "eslint>ajv": ">=6.14.0 <7",
147
+ "flatted": ">=3.4.0",
148
+ "glob": ">=11.1.0",
149
+ "hono": ">=4.11.4",
150
+ "immutable": ">=4.3.8 <5",
151
+ "js-yaml": ">=4.1.1",
152
+ "minimatch": ">=10.2.3",
153
+ "qs": "^6.14.1",
154
+ "rollup": ">=4.59.0",
155
+ "tough-cookie": "=4.1.3",
156
+ "vite": "^7.1.12"
157
+ }
132
158
  }
133
- }
159
+ }