@accounter/client 0.0.8-alpha-20251029111239-192c5afd2d66a4d11ea8217039b86666b6fff216 → 0.0.8-alpha-20251029124448-6b4f8bc975a23de63429b68d0806022dbfc5b226
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/assets/{Checkbox-BfB2aYmM.js → Checkbox-Ddw01d64.js} +2 -2
- package/dist/assets/{MultiSelect-CGvaXcuH.js → MultiSelect-CBtq6WUv.js} +1 -1
- package/dist/assets/{Pagination-D4fkmYTl.js → Pagination-BM-86UO5.js} +1 -1
- package/dist/assets/{Progress-CQs7EuQ2.js → Progress-Bda-J3ZH.js} +1 -1
- package/dist/assets/{Table-C2EjuqpH.js → Table-CYqAEQfS.js} +1 -1
- package/dist/assets/{Typography-bz4ZX5sI.js → Typography--U0GsZ21.js} +1 -1
- package/dist/assets/{YearPickerInput-CURoIYu6.js → YearPickerInput-CgU-feeq.js} +1 -1
- package/dist/assets/{accordion-DWmBRtUi.js → accordion-B8kebokE.js} +1 -1
- package/dist/assets/{accountant-approvals-C9FCfRoL.js → accountant-approvals-CUluc3sH.js} +1 -1
- package/dist/assets/{accounter-table-C70NKDaW.js → accounter-table-CM6PQ9Aw.js} +1 -1
- package/dist/assets/{addDays-BGYF7FkS.js → addDays-DGlDD_vj.js} +1 -1
- package/dist/assets/{all-charges-CkPb7TjD.js → all-charges-DpQS6Xp3.js} +1 -1
- package/dist/assets/{arrow-up-down-B-KqfJyD.js → arrow-up-down-C61ge4J5.js} +1 -1
- package/dist/assets/{building-2-BAwr8r-2.js → building-2-3KauBrnS.js} +1 -1
- package/dist/assets/{business-DLu0ofgu.js → business-RCuQN-RO.js} +7 -17
- package/dist/assets/business-extended-info-DmQ7B7-Z.js +13 -0
- package/dist/assets/{business-header-B_qcrJW_.js → business-header-B-uHcc1D.js} +1 -1
- package/dist/assets/business-transactions-filters-D-Y8vZwZ.js +1 -0
- package/dist/assets/business-transactions-single-CEE249QN.js +1 -0
- package/dist/assets/business-trip-3kCBQ5MD.js +1 -0
- package/dist/assets/{charge-aBSxCGi3.js → charge-D19rkm2C.js} +1 -1
- package/dist/assets/{charges-filters-BRuJ3XbB.js → charges-filters-BUFmsiTq.js} +1 -1
- package/dist/assets/{charges-ledger-validation-DjuvGES2.js → charges-ledger-validation-OPtbHzXu.js} +1 -1
- package/dist/assets/charges-table-D_GDHvFS.js +62 -0
- package/dist/assets/{chart-BSh0rsm7.js → chart-iyOBgiH0.js} +1 -1
- package/dist/assets/{data-table-pagination-BCuaIseR.js → data-table-pagination-CKN0E29f.js} +1 -1
- package/dist/assets/download-csv-button-DZ5cKqkV.js +1 -0
- package/dist/assets/{editable-business-trip-BLWzKbN3.js → editable-business-trip-CRiuNdbP.js} +1 -1
- package/dist/assets/{funnel-XiON1wPY.js → funnel-BlaCusqP.js} +1 -1
- package/dist/assets/{index-BdnLryTF.js → index-B2_EbsaK.js} +191 -191
- package/dist/assets/index-B8pzYiEH.js +1 -0
- package/dist/assets/{index-DOSLXKPY.js → index-BAGVbiiM.js} +1 -1
- package/dist/assets/{index-D7GKOJU4.js → index-BD86tRnn.js} +2 -2
- package/dist/assets/{index-C_nLGgCr.js → index-BGh0NOfw.js} +1 -1
- package/dist/assets/{index-CtDDVAsw.js → index-BKiLhEyi.js} +1 -1
- package/dist/assets/{index-D9RA6cVt.js → index-BNAjS3Tn.js} +2 -2
- package/dist/assets/{index-DbbPcdZ7.js → index-BRSlJnxd.js} +2 -2
- package/dist/assets/{index-CA6LHUxs.js → index-BoL57v1D.js} +1 -1
- package/dist/assets/{index-C-RIsd1H.js → index-C2GP2DWO.js} +2 -2
- package/dist/assets/{index-CJP0f2Bm.js → index-CM60VmgR.js} +1 -1
- package/dist/assets/index-CRLPoT61.js +6 -0
- package/dist/assets/index-CRooGu6R.js +1 -0
- package/dist/assets/{index-CxE91GPE.js → index-C_OSDuUb.js} +1 -1
- package/dist/assets/{index-CVNgfFi3.js → index-Cc7exUI5.js} +1 -1
- package/dist/assets/{index-BwrF7ixX.js → index-Co66MgF6.js} +2 -2
- package/dist/assets/{index-BPLQ_Cjg.js → index-CyBAoT0l.js} +1 -1
- package/dist/assets/{index-BYCdqffp.js → index-D5tmtR-a.js} +7 -7
- package/dist/assets/{index-3Fyx3NBp.js → index-DINxWoMX.js} +1 -1
- package/dist/assets/{index-BdzdEbUC.js → index-DIiuo0-v.js} +1 -1
- package/dist/assets/{index-Diqx01g3.js → index-DtrRL2jA.js} +1 -1
- package/dist/assets/{index-BVTpNGNk.js → index-EaY6ZYvr.js} +2 -2
- package/dist/assets/{index-DaSx2wiU.js → index-mMqWkzUL.js} +1 -1
- package/dist/assets/{index-pjJUDHWQ.js → index-xLWv_qf6.js} +1 -1
- package/dist/assets/{index-By2sHbGk.js → index-yOhbO3fy.js} +1 -1
- package/dist/assets/{index.es-BWSz-k0E.js → index.es-CaOIcY7v.js} +1 -1
- package/dist/assets/{insert-business-trip-modal-Bk-kugZI.js → insert-business-trip-modal-BwOnvw7X.js} +2 -2
- package/dist/assets/issue-document-CzBtBCCO.js +1 -0
- package/dist/assets/{list-plus-DINtfnSi.js → list-plus-CGvSlslE.js} +1 -1
- package/dist/assets/{login-page-DVwxXAvd.js → login-page-BTcklqv4.js} +1 -1
- package/dist/assets/{match-document-modal--iAusdTp.js → match-document-modal-DcL0siQq.js} +4 -4
- package/dist/assets/{missing-info-charges-CQNTClQ3.js → missing-info-charges-DfwRkzNe.js} +1 -1
- package/dist/assets/{modal-BzwJJ2TM.js → modal-B0uNLang.js} +1 -1
- package/dist/assets/{page-layout-NF77oib6.js → page-layout-C0GJoVTR.js} +1 -1
- package/dist/assets/{page-not-found-Cu_0zp5u.js → page-not-found-9UX5vsGE.js} +1 -1
- package/dist/assets/{panel-top-open-BApXXBMD.js → panel-top-open-BFNhAe3f.js} +1 -1
- package/dist/assets/{pencil-CLaFsm6E.js → pencil-9Th5X-OY.js} +1 -1
- package/dist/assets/{report-commentary-row-BGN_tI-P.js → report-commentary-row-CNIlhboC.js} +1 -1
- package/dist/assets/{save-DsE11_Et.js → save-qtyyZLc5.js} +1 -1
- package/dist/assets/{similar-transactions-modal-CoZU6FU3.js → similar-transactions-modal-nk8VHEtX.js} +1 -1
- package/dist/assets/sub-fkVv9ghZ.js +1 -0
- package/dist/assets/subMonths-5wFmciT1.js +1 -0
- package/dist/assets/{summary-BasZ3QlN.js → summary-DuWhfNdL.js} +1 -1
- package/dist/assets/{toggle-expansion-button-DPcDIe-2.js → toggle-expansion-button-41Ejffq3.js} +1 -1
- package/dist/assets/tooltip-lhMCop8U.js +1 -0
- package/dist/assets/{use-url-query-Bp_LkJaa.js → use-url-query-BPzyQB93.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/src/app.tsx +108 -0
- package/src/components/business/index.tsx +1 -31
- package/src/components/business/transactions-section.tsx +2 -24
- package/src/components/{business-ledger → business-transactions}/business-extended-info.tsx +27 -25
- package/src/components/{business-ledger/business-ledger-filters.tsx → business-transactions/business-transactions-filters.tsx} +12 -12
- package/src/components/{business-ledger/business-ledger-single.tsx → business-transactions/business-transactions-single.tsx} +13 -13
- package/src/components/{business-ledger → business-transactions}/download-csv.tsx +25 -25
- package/src/components/{business-ledger → business-transactions}/index.tsx +15 -15
- package/src/components/charges/charge-extended-info.tsx +4 -45
- package/src/components/layout/sidelinks.tsx +2 -2
- package/src/components/ledger-table/columns.tsx +4 -4
- package/src/components/ledger-table/index.tsx +181 -152
- package/src/components/reports/conto/custom-node.tsx +1 -1
- package/src/components/reports/trial-balance-report/trial-balance-report-account.tsx +1 -1
- package/src/components/transactions-table/columns.tsx +9 -9
- package/src/components/transactions-table/index.tsx +21 -56
- package/src/gql/gql.ts +12 -30
- package/src/gql/graphql.ts +406 -181
- package/src/providers/index.ts +4 -0
- package/src/router/config.tsx +14 -14
- package/src/router/routes.ts +2 -2
- package/dist/assets/business-extended-info-vAiMQKwm.js +0 -13
- package/dist/assets/business-ledger-filters-CNjRVS0K.js +0 -1
- package/dist/assets/business-ledger-single-BrattJvc.js +0 -1
- package/dist/assets/business-trip-DZqft86E.js +0 -1
- package/dist/assets/charges-table--gOKotyF.js +0 -62
- package/dist/assets/download-csv-button-B0eh9bzg.js +0 -1
- package/dist/assets/index-B05N38w4.js +0 -6
- package/dist/assets/index-BS5IhG6A.js +0 -1
- package/dist/assets/index-Ci8Rcu9T.js +0 -1
- package/dist/assets/issue-document-BcWeUsrG.js +0 -1
- package/dist/assets/sub-DLRNYZyc.js +0 -1
- package/dist/assets/subMonths-Bc9skHhr.js +0 -1
- package/dist/assets/tooltip-CICdw5IX.js +0 -1
- package/src/components/business/balance-section.tsx +0 -26
- package/src/components/business/ledger-section.tsx +0 -49
- package/src/providers/index.tsx +0 -56
|
@@ -6,10 +6,10 @@ import { useQuery } from 'urql';
|
|
|
6
6
|
import { ROUTES } from '@/router/routes.js';
|
|
7
7
|
import { Mark, Table, Tooltip } from '@mantine/core';
|
|
8
8
|
import {
|
|
9
|
-
|
|
9
|
+
BusinessTransactionsInfoDocument,
|
|
10
10
|
Currency,
|
|
11
|
-
type BusinessLedgerInfoQuery,
|
|
12
11
|
type BusinessTransactionsFilter,
|
|
12
|
+
type BusinessTransactionsInfoQuery,
|
|
13
13
|
} from '../../gql/graphql.js';
|
|
14
14
|
import { FIAT_CURRENCIES, formatAmountWithCurrency } from '../../helpers/index.js';
|
|
15
15
|
import { AccounterLoader } from '../common/index.js';
|
|
@@ -18,7 +18,7 @@ import { DownloadCSV } from './download-csv.js';
|
|
|
18
18
|
|
|
19
19
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- used by codegen
|
|
20
20
|
/* GraphQL */ `
|
|
21
|
-
query
|
|
21
|
+
query BusinessTransactionsInfo($filters: BusinessTransactionsFilter) {
|
|
22
22
|
businessTransactionsFromLedgerRecords(filters: $filters) {
|
|
23
23
|
... on BusinessTransactionsFromLedgerRecordsSuccessfulResult {
|
|
24
24
|
businessTransactions {
|
|
@@ -54,8 +54,8 @@ import { DownloadCSV } from './download-csv.js';
|
|
|
54
54
|
}
|
|
55
55
|
`;
|
|
56
56
|
|
|
57
|
-
export type
|
|
58
|
-
|
|
57
|
+
export type ExtendedTransaction = Extract<
|
|
58
|
+
BusinessTransactionsInfoQuery['businessTransactionsFromLedgerRecords'],
|
|
59
59
|
{ __typename?: 'BusinessTransactionsFromLedgerRecordsSuccessfulResult' }
|
|
60
60
|
>['businessTransactions'][number] & {
|
|
61
61
|
ilsBalance: number;
|
|
@@ -71,7 +71,7 @@ export function BusinessExtendedInfo({ businessID, filter }: Props): ReactElemen
|
|
|
71
71
|
const [isExtendAllCurrencies, setISExtendAllCurrencies] = useState(false);
|
|
72
72
|
const { fromDate, ownerIds, toDate } = filter ?? {};
|
|
73
73
|
const [{ data, fetching }] = useQuery({
|
|
74
|
-
query:
|
|
74
|
+
query: BusinessTransactionsInfoDocument,
|
|
75
75
|
variables: {
|
|
76
76
|
filters: {
|
|
77
77
|
fromDate,
|
|
@@ -82,42 +82,44 @@ export function BusinessExtendedInfo({ businessID, filter }: Props): ReactElemen
|
|
|
82
82
|
},
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
-
const
|
|
85
|
+
const transactions =
|
|
86
86
|
data?.businessTransactionsFromLedgerRecords.__typename === 'CommonError'
|
|
87
87
|
? []
|
|
88
88
|
: (data?.businessTransactionsFromLedgerRecords.businessTransactions.sort((a, b) =>
|
|
89
89
|
a.invoiceDate > b.invoiceDate ? 1 : -1,
|
|
90
90
|
) ?? []);
|
|
91
91
|
|
|
92
|
-
const
|
|
93
|
-
for (let i = 0; i <
|
|
94
|
-
const { __typename, ...
|
|
92
|
+
const extendedTransactions: Array<ExtendedTransaction> = [];
|
|
93
|
+
for (let i = 0; i < transactions.length; i++) {
|
|
94
|
+
const { __typename, ...coreTransaction } = transactions[i];
|
|
95
95
|
const ilsBalance =
|
|
96
96
|
i === 0
|
|
97
|
-
?
|
|
98
|
-
: (
|
|
97
|
+
? coreTransaction.amount.raw
|
|
98
|
+
: (extendedTransactions[i - 1].ilsBalance ?? 0) + coreTransaction.amount.raw;
|
|
99
99
|
const foreignCurrenciesBalance: Record<string, number> = {};
|
|
100
100
|
Object.values(Currency).map(currency => {
|
|
101
101
|
if (currency !== Currency.Ils) {
|
|
102
102
|
const key = `${currency.toLowerCase()}Balance`;
|
|
103
103
|
foreignCurrenciesBalance[key] =
|
|
104
104
|
i === 0
|
|
105
|
-
? ((
|
|
106
|
-
?
|
|
105
|
+
? ((coreTransaction.foreignAmount?.currency === currency
|
|
106
|
+
? coreTransaction.foreignAmount?.raw
|
|
107
107
|
: 0) ?? 0)
|
|
108
|
-
: (
|
|
109
|
-
(
|
|
108
|
+
: (extendedTransactions[i - 1]?.[key] ?? 0) +
|
|
109
|
+
(coreTransaction.foreignAmount?.currency === currency
|
|
110
|
+
? coreTransaction.foreignAmount?.raw
|
|
111
|
+
: 0);
|
|
110
112
|
}
|
|
111
113
|
});
|
|
112
|
-
|
|
113
|
-
...
|
|
114
|
+
extendedTransactions.push({
|
|
115
|
+
...coreTransaction,
|
|
114
116
|
ilsBalance,
|
|
115
117
|
...foreignCurrenciesBalance,
|
|
116
|
-
} as (typeof
|
|
118
|
+
} as (typeof extendedTransactions)[number]);
|
|
117
119
|
}
|
|
118
120
|
|
|
119
121
|
const currencies = new Set(
|
|
120
|
-
|
|
122
|
+
transactions.filter(t => t.foreignAmount?.currency).map(t => t.foreignAmount!.currency),
|
|
121
123
|
);
|
|
122
124
|
const isEur = isExtendAllCurrencies || currencies.has(Currency.Eur);
|
|
123
125
|
const isUsd = isExtendAllCurrencies || currencies.has(Currency.Usd);
|
|
@@ -127,7 +129,7 @@ export function BusinessExtendedInfo({ businessID, filter }: Props): ReactElemen
|
|
|
127
129
|
const isAud = isExtendAllCurrencies || currencies.has(Currency.Aud);
|
|
128
130
|
const isSek = isExtendAllCurrencies || currencies.has(Currency.Sek);
|
|
129
131
|
|
|
130
|
-
const businessName =
|
|
132
|
+
const businessName = transactions[0]?.business.name ?? 'unknown';
|
|
131
133
|
|
|
132
134
|
return (
|
|
133
135
|
<div className="flex flex-row gap-5">
|
|
@@ -214,7 +216,7 @@ export function BusinessExtendedInfo({ businessID, filter }: Props): ReactElemen
|
|
|
214
216
|
<th>Counter Account</th>
|
|
215
217
|
<th>
|
|
216
218
|
<DownloadCSV
|
|
217
|
-
|
|
219
|
+
transactions={extendedTransactions}
|
|
218
220
|
businessName={businessName}
|
|
219
221
|
fromDate={filter?.fromDate ?? undefined}
|
|
220
222
|
toDate={filter?.toDate ?? undefined}
|
|
@@ -223,7 +225,7 @@ export function BusinessExtendedInfo({ businessID, filter }: Props): ReactElemen
|
|
|
223
225
|
</tr>
|
|
224
226
|
</thead>
|
|
225
227
|
<tbody>
|
|
226
|
-
{
|
|
228
|
+
{extendedTransactions.map((row, index) => (
|
|
227
229
|
<tr
|
|
228
230
|
key={index}
|
|
229
231
|
className="cursor-pointer"
|
|
@@ -297,7 +299,7 @@ export function CurrencyCells({
|
|
|
297
299
|
data,
|
|
298
300
|
}: {
|
|
299
301
|
currency: Currency;
|
|
300
|
-
data:
|
|
302
|
+
data: ExtendedTransaction;
|
|
301
303
|
}): ReactElement {
|
|
302
304
|
const foreignAmount =
|
|
303
305
|
data.foreignAmount && data.foreignAmount.currency === currency ? data.foreignAmount : null;
|
|
@@ -327,7 +329,7 @@ const currenciesToExtend = Object.values(Currency).filter(
|
|
|
327
329
|
currency => !FIAT_CURRENCIES.includes(currency),
|
|
328
330
|
);
|
|
329
331
|
|
|
330
|
-
export function ExtendedCurrencyCells({ data }: { data:
|
|
332
|
+
export function ExtendedCurrencyCells({ data }: { data: ExtendedTransaction }): ReactElement {
|
|
331
333
|
return (
|
|
332
334
|
<>
|
|
333
335
|
{currenciesToExtend.map(currency => (
|
|
@@ -9,29 +9,29 @@ import { type BusinessTransactionsFilter } from '../../gql/graphql.js';
|
|
|
9
9
|
import { isObjectEmpty, TIMELESS_DATE_REGEX } from '../../helpers/index.js';
|
|
10
10
|
import { useGetBusinesses } from '../../hooks/use-get-businesses.js';
|
|
11
11
|
import { useUrlQuery } from '../../hooks/use-url-query.js';
|
|
12
|
-
import { UserContext } from '../../providers/user-provider.
|
|
12
|
+
import { UserContext } from '../../providers/user-provider.js';
|
|
13
13
|
import { PopUpModal } from '../common/index.js';
|
|
14
|
-
import { Button } from '../ui/button.
|
|
14
|
+
import { Button } from '../ui/button.js';
|
|
15
15
|
|
|
16
|
-
export function
|
|
16
|
+
export function encodeTransactionsFilters(
|
|
17
17
|
filter?: BusinessTransactionsFilter | null,
|
|
18
18
|
): string | null {
|
|
19
19
|
return !filter || isObjectEmpty(filter) ? null : encodeURIComponent(JSON.stringify(filter));
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
interface
|
|
22
|
+
interface BusinessTransactionsFilterFormProps {
|
|
23
23
|
filter: BusinessTransactionsFilter;
|
|
24
24
|
setFilter: (filter: BusinessTransactionsFilter) => void;
|
|
25
25
|
closeModal: () => void;
|
|
26
26
|
single?: boolean;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
function
|
|
29
|
+
function BusinessTransactionsFilterForm({
|
|
30
30
|
filter,
|
|
31
31
|
setFilter,
|
|
32
32
|
closeModal,
|
|
33
33
|
single = false,
|
|
34
|
-
}:
|
|
34
|
+
}: BusinessTransactionsFilterFormProps): ReactElement {
|
|
35
35
|
const { control, handleSubmit } = useForm<BusinessTransactionsFilter>({
|
|
36
36
|
defaultValues: { ...filter },
|
|
37
37
|
});
|
|
@@ -199,15 +199,15 @@ function BusinessLedgerRecordsFilterForm({
|
|
|
199
199
|
);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
interface
|
|
202
|
+
interface BusinessTransactionsFilterProps {
|
|
203
203
|
filter: BusinessTransactionsFilter;
|
|
204
204
|
setFilter: (filter: BusinessTransactionsFilter) => void;
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
-
export function
|
|
207
|
+
export function BusinessTransactionsFilters({
|
|
208
208
|
filter,
|
|
209
209
|
setFilter,
|
|
210
|
-
}:
|
|
210
|
+
}: BusinessTransactionsFilterProps): ReactElement {
|
|
211
211
|
const [opened, setOpened] = useState(false);
|
|
212
212
|
const [isFiltered, setIsFiltered] = useState(!isObjectEmpty(filter));
|
|
213
213
|
const { get, set } = useUrlQuery();
|
|
@@ -232,9 +232,9 @@ export function BusinessLedgerRecordsFilters({
|
|
|
232
232
|
// update url on filter change
|
|
233
233
|
useEffect(() => {
|
|
234
234
|
const newFilter = isObjectEmpty(filter) ? null : encodeURIComponent(JSON.stringify(filter));
|
|
235
|
-
const oldFilter = get('
|
|
235
|
+
const oldFilter = get('transactionsFilters');
|
|
236
236
|
if (newFilter !== oldFilter) {
|
|
237
|
-
set('
|
|
237
|
+
set('transactionsFilters', newFilter);
|
|
238
238
|
}
|
|
239
239
|
}, [filter, get, set]);
|
|
240
240
|
|
|
@@ -244,7 +244,7 @@ export function BusinessLedgerRecordsFilters({
|
|
|
244
244
|
opened={opened}
|
|
245
245
|
onClose={(): void => setOpened(false)}
|
|
246
246
|
content={
|
|
247
|
-
<
|
|
247
|
+
<BusinessTransactionsFilterForm
|
|
248
248
|
single
|
|
249
249
|
filter={filter}
|
|
250
250
|
setFilter={onSetFilter}
|
|
@@ -3,31 +3,31 @@ import { useParams } from 'react-router-dom';
|
|
|
3
3
|
import { useQuery } from 'urql';
|
|
4
4
|
import { Mark } from '@mantine/core';
|
|
5
5
|
import {
|
|
6
|
-
|
|
6
|
+
BusinessTransactionsSummeryDocument,
|
|
7
7
|
Currency,
|
|
8
|
-
type BusinessLedgerRecordsSummeryQuery,
|
|
9
8
|
type BusinessTransactionsFilter,
|
|
9
|
+
type BusinessTransactionsSummeryQuery,
|
|
10
10
|
} from '../../gql/graphql.js';
|
|
11
11
|
import { useUrlQuery } from '../../hooks/use-url-query.js';
|
|
12
12
|
import { FiltersContext } from '../../providers/filters-context.js';
|
|
13
13
|
import { AccounterLoader, AccounterTable } from '../common/index.js';
|
|
14
14
|
import { BusinessExtendedInfo } from './business-extended-info.js';
|
|
15
|
-
import {
|
|
15
|
+
import { BusinessTransactionsFilters } from './business-transactions-filters.js';
|
|
16
16
|
|
|
17
17
|
type Props = {
|
|
18
18
|
businessId?: string;
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
-
export const
|
|
21
|
+
export const BusinessTransactionsSingle = ({ businessId }: Props): ReactElement => {
|
|
22
22
|
const { businessId: businessIdFromUrl } = useParams<{ businessId: string }>();
|
|
23
23
|
const { get } = useUrlQuery();
|
|
24
24
|
const { setFiltersContext } = useContext(FiltersContext);
|
|
25
25
|
const id = businessId || businessIdFromUrl;
|
|
26
26
|
const [filter, setFilter] = useState<BusinessTransactionsFilter>(
|
|
27
|
-
get('
|
|
27
|
+
get('transactionsFilters')
|
|
28
28
|
? {
|
|
29
29
|
...(JSON.parse(
|
|
30
|
-
decodeURIComponent(get('
|
|
30
|
+
decodeURIComponent(get('transactionsFilters') as string),
|
|
31
31
|
) as BusinessTransactionsFilter),
|
|
32
32
|
businessIDs: id ? [id] : [],
|
|
33
33
|
}
|
|
@@ -36,17 +36,17 @@ export const BusinessLedgerRecordsSingle = ({ businessId }: Props): ReactElement
|
|
|
36
36
|
},
|
|
37
37
|
);
|
|
38
38
|
const [{ data, fetching }] = useQuery({
|
|
39
|
-
query:
|
|
39
|
+
query: BusinessTransactionsSummeryDocument,
|
|
40
40
|
variables: {
|
|
41
41
|
filters: filter,
|
|
42
42
|
},
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
useEffect(() => {
|
|
46
|
-
setFiltersContext(<
|
|
46
|
+
setFiltersContext(<BusinessTransactionsFilters filter={filter} setFilter={setFilter} />);
|
|
47
47
|
}, [data, filter, setFiltersContext, setFilter]);
|
|
48
48
|
|
|
49
|
-
const
|
|
49
|
+
const businessTransactionsSum = useMemo(() => {
|
|
50
50
|
if (data?.businessTransactionsSumFromLedgerRecords.__typename === 'CommonError') {
|
|
51
51
|
return [];
|
|
52
52
|
}
|
|
@@ -68,7 +68,7 @@ export const BusinessLedgerRecordsSingle = ({ businessId }: Props): ReactElement
|
|
|
68
68
|
striped
|
|
69
69
|
highlightOnHover
|
|
70
70
|
stickyHeader
|
|
71
|
-
items={
|
|
71
|
+
items={businessTransactionsSum}
|
|
72
72
|
columns={[
|
|
73
73
|
{
|
|
74
74
|
title: 'Business Name',
|
|
@@ -106,14 +106,14 @@ export const BusinessLedgerRecordsSingle = ({ businessId }: Props): ReactElement
|
|
|
106
106
|
);
|
|
107
107
|
};
|
|
108
108
|
|
|
109
|
-
type
|
|
110
|
-
|
|
109
|
+
type BusinessTransactionsSum = Extract<
|
|
110
|
+
BusinessTransactionsSummeryQuery['businessTransactionsSumFromLedgerRecords'],
|
|
111
111
|
{ businessTransactionsSum: unknown }
|
|
112
112
|
>['businessTransactionsSum'][number];
|
|
113
113
|
|
|
114
114
|
type CellInfo = {
|
|
115
115
|
title: ReactNode;
|
|
116
|
-
value: (data:
|
|
116
|
+
value: (data: BusinessTransactionsSum) => string | ReactNode;
|
|
117
117
|
style?: React.CSSProperties;
|
|
118
118
|
};
|
|
119
119
|
|
|
@@ -3,47 +3,47 @@ import { format } from 'date-fns';
|
|
|
3
3
|
import { Currency } from '../../gql/graphql.js';
|
|
4
4
|
import { currencyCodeToSymbol, type TimelessDateString } from '../../helpers/index.js';
|
|
5
5
|
import { DownloadCSVButton } from '../common/index.js';
|
|
6
|
-
import type {
|
|
6
|
+
import type { ExtendedTransaction } from './business-extended-info.js';
|
|
7
7
|
|
|
8
8
|
interface Props {
|
|
9
|
-
|
|
9
|
+
transactions: Array<ExtendedTransaction>;
|
|
10
10
|
businessName: string;
|
|
11
11
|
fromDate?: TimelessDateString;
|
|
12
12
|
toDate?: TimelessDateString;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export const DownloadCSV = ({
|
|
16
|
-
|
|
16
|
+
transactions,
|
|
17
17
|
businessName,
|
|
18
18
|
fromDate,
|
|
19
19
|
toDate,
|
|
20
20
|
}: Props): ReactElement => {
|
|
21
21
|
const createFileVariables = useCallback(async () => {
|
|
22
|
-
const csvData = convertToCSV(
|
|
23
|
-
const fileName = `business_${businessName}
|
|
22
|
+
const csvData = convertToCSV(transactions);
|
|
23
|
+
const fileName = `business_${businessName}_transactions${fromDate ? `_${fromDate}` : ''}${toDate ? `_${toDate}` : ''}`;
|
|
24
24
|
return {
|
|
25
25
|
fileName,
|
|
26
26
|
fileContent: csvData,
|
|
27
27
|
};
|
|
28
|
-
}, [
|
|
28
|
+
}, [transactions, businessName, fromDate, toDate]);
|
|
29
29
|
|
|
30
30
|
return <DownloadCSVButton createFileVariables={createFileVariables} />;
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
const convertToCSV = (
|
|
33
|
+
const convertToCSV = (transactions: Array<ExtendedTransaction>): string => {
|
|
34
34
|
let csvString = '';
|
|
35
35
|
|
|
36
36
|
const currencies = Array.from(
|
|
37
37
|
new Set(
|
|
38
|
-
|
|
38
|
+
transactions.filter(t => t.foreignAmount?.currency).map(t => t.foreignAmount!.currency),
|
|
39
39
|
),
|
|
40
40
|
);
|
|
41
41
|
|
|
42
42
|
csvString += `Sorting Date,Date,Amount,Amount Balance,${getHeadersFromForeignCurrencies(currencies)}Reference,Details,Counter Account\r\n`;
|
|
43
43
|
|
|
44
|
-
for (const
|
|
45
|
-
const
|
|
46
|
-
csvString +=
|
|
44
|
+
for (const transaction of transactions) {
|
|
45
|
+
const stringifiedTransaction = handleTransaction(transaction, currencies);
|
|
46
|
+
csvString += stringifiedTransaction;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
return csvString;
|
|
@@ -59,13 +59,13 @@ function getHeadersFromForeignCurrencies(currencies: Array<Currency>): string {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
function getAmountsFromForeignCurrencies(
|
|
62
|
-
|
|
62
|
+
transaction: ExtendedTransaction,
|
|
63
63
|
currencies: Array<Currency>,
|
|
64
64
|
): string {
|
|
65
65
|
let amounts = '';
|
|
66
66
|
currencies.map(currency => {
|
|
67
|
-
if (
|
|
68
|
-
amounts += `${
|
|
67
|
+
if (transaction.foreignAmount && transaction.foreignAmount.currency === currency) {
|
|
68
|
+
amounts += `${transaction.foreignAmount.raw},${transaction[`${currency.toLowerCase()}Balance` as keyof ExtendedTransaction] ?? 0},`;
|
|
69
69
|
} else {
|
|
70
70
|
amounts += ',,';
|
|
71
71
|
}
|
|
@@ -73,21 +73,21 @@ function getAmountsFromForeignCurrencies(
|
|
|
73
73
|
return amounts;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
function
|
|
77
|
-
let
|
|
76
|
+
function handleTransaction(transaction: ExtendedTransaction, currencies: Array<Currency>): string {
|
|
77
|
+
let transactionString = '';
|
|
78
78
|
|
|
79
|
-
const sortingDate =
|
|
80
|
-
? format(new Date(
|
|
79
|
+
const sortingDate = transaction.invoiceDate
|
|
80
|
+
? format(new Date(transaction.invoiceDate), 'yyy-MM-dd')
|
|
81
81
|
: null;
|
|
82
|
-
const date =
|
|
83
|
-
? format(new Date(
|
|
82
|
+
const date = transaction.invoiceDate
|
|
83
|
+
? format(new Date(transaction.invoiceDate), 'dd/MM/yy')
|
|
84
84
|
: null;
|
|
85
|
-
const ilsAmount =
|
|
86
|
-
const { ilsBalance, reference, details } =
|
|
87
|
-
const counterAccount =
|
|
85
|
+
const ilsAmount = transaction.amount.raw;
|
|
86
|
+
const { ilsBalance, reference, details } = transaction;
|
|
87
|
+
const counterAccount = transaction.counterAccount?.name ?? '';
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
return
|
|
89
|
+
transactionString += `${sortingDate},${date},${ilsAmount},${ilsBalance},${getAmountsFromForeignCurrencies(transaction, currencies)}${sanitizeString(reference ?? '')},${sanitizeString(details ?? '')},${sanitizeString(counterAccount)},\r\n`;
|
|
90
|
+
return transactionString;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
function sanitizeString(content: string | number): string {
|
|
@@ -9,10 +9,10 @@ import {
|
|
|
9
9
|
import { useQuery } from 'urql';
|
|
10
10
|
import { Mark, Table, Text, Tooltip } from '@mantine/core';
|
|
11
11
|
import {
|
|
12
|
-
|
|
12
|
+
BusinessTransactionsSummeryDocument,
|
|
13
13
|
Currency,
|
|
14
|
-
type BusinessLedgerRecordsSummeryQuery,
|
|
15
14
|
type BusinessTransactionsFilter,
|
|
15
|
+
type BusinessTransactionsSummeryQuery,
|
|
16
16
|
} from '../../gql/graphql.js';
|
|
17
17
|
import { FIAT_CURRENCIES } from '../../helpers/index.js';
|
|
18
18
|
import { useUrlQuery } from '../../hooks/use-url-query.js';
|
|
@@ -21,11 +21,11 @@ import { AccounterTableRow } from '../common/index.js';
|
|
|
21
21
|
import { PageLayout } from '../layout/page-layout.js';
|
|
22
22
|
import { Button } from '../ui/button.js';
|
|
23
23
|
import { BusinessExtendedInfo } from './business-extended-info.js';
|
|
24
|
-
import {
|
|
24
|
+
import { BusinessTransactionsFilters } from './business-transactions-filters.js';
|
|
25
25
|
|
|
26
26
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- used by codegen
|
|
27
27
|
/* GraphQL */ `
|
|
28
|
-
query
|
|
28
|
+
query BusinessTransactionsSummery($filters: BusinessTransactionsFilter) {
|
|
29
29
|
businessTransactionsSumFromLedgerRecords(filters: $filters) {
|
|
30
30
|
... on BusinessTransactionsSumFromLedgerRecordsSuccessfulResult {
|
|
31
31
|
businessTransactionsSum {
|
|
@@ -66,32 +66,32 @@ import { BusinessLedgerRecordsFilters } from './business-ledger-filters.js';
|
|
|
66
66
|
}
|
|
67
67
|
`;
|
|
68
68
|
|
|
69
|
-
type
|
|
70
|
-
|
|
69
|
+
type BusinessTransactionsSum = Extract<
|
|
70
|
+
BusinessTransactionsSummeryQuery['businessTransactionsSumFromLedgerRecords'],
|
|
71
71
|
{ businessTransactionsSum: unknown }
|
|
72
72
|
>['businessTransactionsSum'][number];
|
|
73
73
|
|
|
74
74
|
type CellInfo = {
|
|
75
75
|
title: string | ReactNode;
|
|
76
76
|
disabled?: boolean;
|
|
77
|
-
value: (item:
|
|
77
|
+
value: (item: BusinessTransactionsSum) => string | ReactNode;
|
|
78
78
|
style?: React.CSSProperties;
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
-
export const
|
|
81
|
+
export const BusinessTransactionsSummery = (): ReactElement => {
|
|
82
82
|
const { get } = useUrlQuery();
|
|
83
83
|
const { setFiltersContext } = useContext(FiltersContext);
|
|
84
84
|
const [isAllOpened, setIsAllOpened] = useState<boolean>(false);
|
|
85
85
|
const [isExpandedCurrencies, setIsExpandedCurrencies] = useState<boolean>(false);
|
|
86
86
|
const [filter, setFilter] = useState<BusinessTransactionsFilter>(
|
|
87
|
-
get('
|
|
87
|
+
get('transactionsFilters')
|
|
88
88
|
? (JSON.parse(
|
|
89
|
-
decodeURIComponent(get('
|
|
89
|
+
decodeURIComponent(get('transactionsFilters') as string),
|
|
90
90
|
) as BusinessTransactionsFilter)
|
|
91
91
|
: {},
|
|
92
92
|
);
|
|
93
93
|
const [{ data, fetching }] = useQuery({
|
|
94
|
-
query:
|
|
94
|
+
query: BusinessTransactionsSummeryDocument,
|
|
95
95
|
variables: {
|
|
96
96
|
filters: filter,
|
|
97
97
|
},
|
|
@@ -100,7 +100,7 @@ export const BusinessLedgerRecordsSummery = (): ReactElement => {
|
|
|
100
100
|
useEffect(() => {
|
|
101
101
|
setFiltersContext(
|
|
102
102
|
<div className="flex flex-row gap-x-5">
|
|
103
|
-
<
|
|
103
|
+
<BusinessTransactionsFilters filter={filter} setFilter={setFilter} />
|
|
104
104
|
<Tooltip label="Expand all accounts">
|
|
105
105
|
<Button
|
|
106
106
|
variant="outline"
|
|
@@ -141,7 +141,7 @@ export const BusinessLedgerRecordsSummery = (): ReactElement => {
|
|
|
141
141
|
isExpandedCurrencies,
|
|
142
142
|
]);
|
|
143
143
|
|
|
144
|
-
const
|
|
144
|
+
const businessTransactionsSum = useMemo(() => {
|
|
145
145
|
if (data?.businessTransactionsSumFromLedgerRecords.__typename === 'CommonError') {
|
|
146
146
|
return [];
|
|
147
147
|
}
|
|
@@ -195,7 +195,7 @@ export const BusinessLedgerRecordsSummery = (): ReactElement => {
|
|
|
195
195
|
];
|
|
196
196
|
|
|
197
197
|
return (
|
|
198
|
-
<PageLayout title="Business
|
|
198
|
+
<PageLayout title="Business Transactions" description="Business Transactions Summery">
|
|
199
199
|
{fetching ? (
|
|
200
200
|
<Loader2 className="h-10 w-10 animate-spin mr-2 self-center" />
|
|
201
201
|
) : (
|
|
@@ -209,7 +209,7 @@ export const BusinessLedgerRecordsSummery = (): ReactElement => {
|
|
|
209
209
|
</tr>
|
|
210
210
|
</thead>
|
|
211
211
|
<tbody>
|
|
212
|
-
{
|
|
212
|
+
{businessTransactionsSum.map((item, index) => (
|
|
213
213
|
<AccounterTableRow
|
|
214
214
|
key={index}
|
|
215
215
|
columns={columns}
|
|
@@ -4,7 +4,6 @@ import { useQuery } from 'urql';
|
|
|
4
4
|
import { Accordion, Box, Collapse, Loader, Tooltip } from '@mantine/core';
|
|
5
5
|
import { useDisclosure } from '@mantine/hooks';
|
|
6
6
|
import {
|
|
7
|
-
ChargeLedgerRecordsTableFieldsFragmentDoc,
|
|
8
7
|
ChargesTableErrorsFieldsFragmentDoc,
|
|
9
8
|
ChargeTableTransactionsFieldsFragmentDoc,
|
|
10
9
|
ConversionChargeInfoFragmentDoc,
|
|
@@ -13,6 +12,7 @@ import {
|
|
|
13
12
|
ExchangeRatesInfoFragmentDoc,
|
|
14
13
|
FetchChargeDocument,
|
|
15
14
|
TableDocumentsFieldsFragmentDoc,
|
|
15
|
+
TableLedgerRecordsFieldsFragmentDoc,
|
|
16
16
|
TableMiscExpensesFieldsFragmentDoc,
|
|
17
17
|
TableSalariesFieldsFragmentDoc,
|
|
18
18
|
type FetchChargeQuery,
|
|
@@ -55,7 +55,7 @@ import { SalariesTable } from './extended-info/salaries-info.jsx';
|
|
|
55
55
|
}
|
|
56
56
|
...DocumentsGalleryFields @defer
|
|
57
57
|
...TableDocumentsFields @defer
|
|
58
|
-
...
|
|
58
|
+
...TableLedgerRecordsFields @defer
|
|
59
59
|
...ChargeTableTransactionsFields @defer
|
|
60
60
|
...ConversionChargeInfo @defer
|
|
61
61
|
...CreditcardBankChargeInfo @defer
|
|
@@ -89,31 +89,6 @@ import { SalariesTable } from './extended-info/salaries-info.jsx';
|
|
|
89
89
|
}
|
|
90
90
|
`;
|
|
91
91
|
|
|
92
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- used by codegen
|
|
93
|
-
/* GraphQL */ `
|
|
94
|
-
fragment ChargeLedgerRecordsTableFields on Charge {
|
|
95
|
-
id
|
|
96
|
-
ledger {
|
|
97
|
-
__typename
|
|
98
|
-
records {
|
|
99
|
-
id
|
|
100
|
-
...LedgerRecordsTableFields
|
|
101
|
-
}
|
|
102
|
-
... on Ledger @defer {
|
|
103
|
-
validate {
|
|
104
|
-
... on LedgerValidation @defer {
|
|
105
|
-
matches
|
|
106
|
-
differences {
|
|
107
|
-
id
|
|
108
|
-
...LedgerRecordsTableFields
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
`;
|
|
116
|
-
|
|
117
92
|
interface Props {
|
|
118
93
|
chargeID: string;
|
|
119
94
|
onChange?: () => void;
|
|
@@ -216,7 +191,7 @@ export function ChargeExtendedInfo({
|
|
|
216
191
|
|
|
217
192
|
const ledgerRecordsAreReady = isFragmentReady(
|
|
218
193
|
FetchChargeDocument,
|
|
219
|
-
|
|
194
|
+
TableLedgerRecordsFieldsFragmentDoc,
|
|
220
195
|
charge,
|
|
221
196
|
);
|
|
222
197
|
|
|
@@ -467,7 +442,7 @@ export function ChargeExtendedInfo({
|
|
|
467
442
|
</div>
|
|
468
443
|
</Accordion.Control>
|
|
469
444
|
<Accordion.Panel>
|
|
470
|
-
{ledgerRecordsAreReady && <
|
|
445
|
+
{ledgerRecordsAreReady && <LedgerTable ledgerFragment={charge} />}
|
|
471
446
|
</Accordion.Panel>
|
|
472
447
|
</Accordion.Item>
|
|
473
448
|
)}
|
|
@@ -485,19 +460,3 @@ export function ChargeExtendedInfo({
|
|
|
485
460
|
</div>
|
|
486
461
|
);
|
|
487
462
|
}
|
|
488
|
-
|
|
489
|
-
type ChargeLedgerTableProps = {
|
|
490
|
-
data: FragmentType<typeof ChargeLedgerRecordsTableFieldsFragmentDoc>;
|
|
491
|
-
};
|
|
492
|
-
|
|
493
|
-
export const ChargeLedgerTable = ({ data }: ChargeLedgerTableProps): ReactElement => {
|
|
494
|
-
const { ledger } = getFragmentData(ChargeLedgerRecordsTableFieldsFragmentDoc, data);
|
|
495
|
-
|
|
496
|
-
return (
|
|
497
|
-
<LedgerTable
|
|
498
|
-
ledgerRecordsData={ledger.records}
|
|
499
|
-
ledgerDiffData={ledger.validate?.differences}
|
|
500
|
-
matches={ledger.validate?.matches}
|
|
501
|
-
/>
|
|
502
|
-
);
|
|
503
|
-
};
|
|
@@ -165,9 +165,9 @@ export const sidelinks: SideLink[] = [
|
|
|
165
165
|
icon: <Factory size={18} />,
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
|
-
title: 'Business
|
|
168
|
+
title: 'Business Transactions',
|
|
169
169
|
label: '',
|
|
170
|
-
href: ROUTES.BUSINESSES.
|
|
170
|
+
href: ROUTES.BUSINESSES.TRANSACTIONS,
|
|
171
171
|
icon: <ArrowLeftRight size={18} />,
|
|
172
172
|
},
|
|
173
173
|
{
|
|
@@ -53,7 +53,7 @@ export const columns: ColumnDef<LedgerRecordRow>[] = [
|
|
|
53
53
|
},
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
|
-
header: 'Debit
|
|
56
|
+
header: 'Debit Account1',
|
|
57
57
|
columns: [
|
|
58
58
|
{
|
|
59
59
|
accessorKey: 'debitAccount1.name',
|
|
@@ -120,7 +120,7 @@ export const columns: ColumnDef<LedgerRecordRow>[] = [
|
|
|
120
120
|
],
|
|
121
121
|
},
|
|
122
122
|
{
|
|
123
|
-
header: 'Credit
|
|
123
|
+
header: 'Credit Account1',
|
|
124
124
|
columns: [
|
|
125
125
|
{
|
|
126
126
|
accessorKey: 'creditAccount1.name',
|
|
@@ -187,7 +187,7 @@ export const columns: ColumnDef<LedgerRecordRow>[] = [
|
|
|
187
187
|
],
|
|
188
188
|
},
|
|
189
189
|
{
|
|
190
|
-
header: 'Debit
|
|
190
|
+
header: 'Debit Account2',
|
|
191
191
|
columns: [
|
|
192
192
|
{
|
|
193
193
|
accessorKey: 'debitAccount2.name',
|
|
@@ -254,7 +254,7 @@ export const columns: ColumnDef<LedgerRecordRow>[] = [
|
|
|
254
254
|
],
|
|
255
255
|
},
|
|
256
256
|
{
|
|
257
|
-
header: 'Credit
|
|
257
|
+
header: 'Credit Account2',
|
|
258
258
|
columns: [
|
|
259
259
|
{
|
|
260
260
|
accessorKey: 'creditAccount2.name',
|