@accounter/server 0.0.9-alpha-20251231123714-6cdd9de71b4672d74ece5d34c438d162987b2c93 → 0.0.9-alpha-20251231171312-67d2850c6eacafb65d42d987f3d49dca3c0f8bdd
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 +27 -5
- package/README.md +66 -3
- package/dist/green-invoice-graphql/src/mesh-artifacts/index.d.ts +1 -1
- package/dist/green-invoice-graphql/src/mesh-artifacts/index.js +2 -2
- package/dist/green-invoice-graphql/src/mesh-artifacts/index.js.map +1 -1
- package/dist/server/scripts/seed-admin-context.js +20 -25
- package/dist/server/scripts/seed-admin-context.js.map +1 -1
- package/dist/server/src/__tests__/db-bootstrap.test.js +7 -2
- package/dist/server/src/__tests__/db-bootstrap.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/business.d.ts +1 -1
- package/dist/server/src/__tests__/factories/financial-account.d.ts +1 -1
- package/dist/server/src/__tests__/factories/index.test.js +1 -0
- package/dist/server/src/__tests__/factories/index.test.js.map +1 -1
- package/dist/server/src/__tests__/factories/tax-category.d.ts +1 -1
- package/dist/server/src/__tests__/factories/tax-category.js +1 -1
- package/dist/server/src/__tests__/factories/tax-category.js.map +1 -1
- package/dist/server/src/__tests__/factories/tax-category.test.js +8 -6
- package/dist/server/src/__tests__/factories/tax-category.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/fixture-loader.d.ts +1 -1
- package/dist/server/src/__tests__/helpers/fixture-loader.js +25 -52
- package/dist/server/src/__tests__/helpers/fixture-loader.js.map +1 -1
- package/dist/server/src/__tests__/helpers/migration-verification.d.ts +1 -1
- package/dist/server/src/__tests__/helpers/migration-verification.js.map +1 -1
- package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js +4 -4
- package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js.map +1 -1
- package/dist/server/src/__tests__/helpers/seed-helpers.d.ts +9 -9
- package/dist/server/src/__tests__/helpers/seed-helpers.js +57 -54
- package/dist/server/src/__tests__/helpers/seed-helpers.js.map +1 -1
- package/dist/server/src/__tests__/seed-admin-context.integration.test.js +2 -1
- package/dist/server/src/__tests__/seed-admin-context.integration.test.js.map +1 -1
- package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js +3 -2
- package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js.map +1 -1
- package/dist/server/src/demo-fixtures/__tests__/seed-and-validate.test.d.ts +1 -0
- package/dist/server/src/demo-fixtures/__tests__/seed-and-validate.test.js +69 -0
- package/dist/server/src/demo-fixtures/__tests__/seed-and-validate.test.js.map +1 -0
- package/dist/server/src/demo-fixtures/__tests__/use-case-registry.test.d.ts +1 -0
- package/dist/server/src/demo-fixtures/__tests__/use-case-registry.test.js +26 -0
- package/dist/server/src/demo-fixtures/__tests__/use-case-registry.test.js.map +1 -0
- package/dist/server/src/demo-fixtures/helpers/admin-context.d.ts +10 -0
- package/dist/server/src/demo-fixtures/helpers/admin-context.js +40 -0
- package/dist/server/src/demo-fixtures/helpers/admin-context.js.map +1 -0
- package/dist/server/src/demo-fixtures/helpers/placeholder.d.ts +45 -0
- package/dist/server/src/demo-fixtures/helpers/placeholder.js +50 -0
- package/dist/server/src/demo-fixtures/helpers/placeholder.js.map +1 -0
- package/dist/server/src/demo-fixtures/helpers/seed-exchange-rates.d.ts +21 -0
- package/dist/server/src/demo-fixtures/helpers/seed-exchange-rates.js +26 -0
- package/dist/server/src/demo-fixtures/helpers/seed-exchange-rates.js.map +1 -0
- package/dist/server/src/demo-fixtures/helpers/seed-vat.d.ts +20 -0
- package/dist/server/src/demo-fixtures/helpers/seed-vat.js +30 -0
- package/dist/server/src/demo-fixtures/helpers/seed-vat.js.map +1 -0
- package/dist/server/src/demo-fixtures/use-cases/equity/shareholder-dividend.d.ts +9 -0
- package/dist/server/src/demo-fixtures/use-cases/equity/shareholder-dividend.js +86 -0
- package/dist/server/src/demo-fixtures/use-cases/equity/shareholder-dividend.js.map +1 -0
- package/dist/server/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.d.ts +12 -0
- package/dist/server/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.js +375 -0
- package/dist/server/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.js.map +1 -0
- package/dist/server/src/demo-fixtures/use-cases/income/client-payment-with-refund.d.ts +10 -0
- package/dist/server/src/demo-fixtures/use-cases/income/client-payment-with-refund.js +113 -0
- package/dist/server/src/demo-fixtures/use-cases/income/client-payment-with-refund.js.map +1 -0
- package/dist/server/src/demo-fixtures/use-cases/index.d.ts +41 -0
- package/dist/server/src/demo-fixtures/use-cases/index.js +50 -0
- package/dist/server/src/demo-fixtures/use-cases/index.js.map +1 -0
- package/dist/server/src/demo-fixtures/validate-demo-data.d.ts +1 -0
- package/dist/server/src/demo-fixtures/validate-demo-data.js +117 -0
- package/dist/server/src/demo-fixtures/validate-demo-data.js.map +1 -0
- package/dist/server/src/demo-fixtures/validators/ledger-validators.d.ts +349 -0
- package/dist/server/src/demo-fixtures/validators/ledger-validators.js +602 -0
- package/dist/server/src/demo-fixtures/validators/ledger-validators.js.map +1 -0
- package/dist/server/src/demo-fixtures/validators/ledger-validators.test.d.ts +1 -0
- package/dist/server/src/demo-fixtures/validators/ledger-validators.test.js +247 -0
- package/dist/server/src/demo-fixtures/validators/ledger-validators.test.js.map +1 -0
- package/dist/server/src/demo-fixtures/validators/types.d.ts +69 -0
- package/dist/server/src/demo-fixtures/validators/types.js +8 -0
- package/dist/server/src/demo-fixtures/validators/types.js.map +1 -0
- package/dist/server/src/fixtures/fixture-spec.d.ts +146 -0
- package/dist/server/src/fixtures/fixture-spec.js +2 -0
- package/dist/server/src/fixtures/fixture-spec.js.map +1 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js +4 -0
- package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js.map +1 -1
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js +4 -3
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js.map +1 -1
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js +5 -3
- package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js.map +1 -1
- package/dist/server/src/shared/constants.d.ts +1 -0
- package/dist/server/src/shared/constants.js +1 -0
- package/dist/server/src/shared/constants.js.map +1 -1
- package/dist/server/src/shared/helpers/misc.js +2 -2
- package/dist/server/src/shared/helpers/misc.js.map +1 -1
- package/docs/demo-staging-guide.md +611 -0
- package/package.json +5 -2
- package/scripts/seed-admin-context.ts +22 -33
- package/src/__tests__/db-bootstrap.test.ts +9 -2
- package/src/__tests__/factories/business.ts +1 -1
- package/src/__tests__/factories/financial-account.ts +1 -1
- package/src/__tests__/factories/index.test.ts +1 -0
- package/src/__tests__/factories/tax-category.test.ts +8 -6
- package/src/__tests__/factories/tax-category.ts +2 -2
- package/src/__tests__/helpers/fixture-loader.ts +26 -61
- package/src/__tests__/helpers/migration-verification.ts +2 -2
- package/src/__tests__/helpers/seed-helpers.business.test.ts +4 -4
- package/src/__tests__/helpers/seed-helpers.ts +66 -75
- package/src/__tests__/seed-admin-context.integration.test.ts +2 -1
- package/src/demo-fixtures/__tests__/deterministic-uuid.test.ts +3 -2
- package/src/demo-fixtures/__tests__/seed-and-validate.test.ts +96 -0
- package/src/demo-fixtures/__tests__/use-case-registry.test.ts +27 -0
- package/src/demo-fixtures/helpers/admin-context.ts +59 -0
- package/src/demo-fixtures/helpers/placeholder.ts +50 -0
- package/src/demo-fixtures/helpers/seed-exchange-rates.ts +29 -0
- package/src/demo-fixtures/helpers/seed-vat.ts +35 -0
- package/src/demo-fixtures/use-cases/equity/shareholder-dividend.ts +88 -0
- package/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.ts +377 -0
- package/src/demo-fixtures/use-cases/income/client-payment-with-refund.ts +115 -0
- package/src/demo-fixtures/use-cases/index.ts +52 -0
- package/src/demo-fixtures/validate-demo-data.ts +153 -0
- package/src/demo-fixtures/validators/README.md +190 -0
- package/src/demo-fixtures/validators/ledger-validators.test.ts +298 -0
- package/src/demo-fixtures/validators/ledger-validators.ts +711 -0
- package/src/demo-fixtures/validators/types.ts +83 -0
- package/src/fixtures/fixture-spec.ts +158 -0
- package/src/modules/charges-matcher/__tests__/single-match-integration.test.ts +6 -0
- package/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.ts +4 -3
- package/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.ts +6 -3
- package/src/shared/constants.ts +2 -0
- package/src/shared/helpers/misc.ts +2 -3
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript interfaces for ledger validation
|
|
3
|
+
*
|
|
4
|
+
* These types match the database schema from accounter_schema.ledger_records
|
|
5
|
+
* and provide context for comprehensive validation of demo data.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Ledger record interface matching the database schema
|
|
10
|
+
*
|
|
11
|
+
* Numeric fields are typed as `string | null` because PostgreSQL returns
|
|
12
|
+
* numeric values as strings when queried via pg driver.
|
|
13
|
+
*/
|
|
14
|
+
export interface LedgerRecord {
|
|
15
|
+
id: string;
|
|
16
|
+
owner_id: string | null;
|
|
17
|
+
charge_id: string;
|
|
18
|
+
|
|
19
|
+
debit_entity1: string | null;
|
|
20
|
+
debit_foreign_amount1: string | null;
|
|
21
|
+
debit_local_amount1: string | null;
|
|
22
|
+
|
|
23
|
+
credit_entity1: string | null;
|
|
24
|
+
credit_foreign_amount1: string | null;
|
|
25
|
+
credit_local_amount1: string | null;
|
|
26
|
+
|
|
27
|
+
debit_entity2: string | null;
|
|
28
|
+
debit_foreign_amount2: string | null;
|
|
29
|
+
debit_local_amount2: string | null;
|
|
30
|
+
|
|
31
|
+
credit_entity2: string | null;
|
|
32
|
+
credit_foreign_amount2: string | null;
|
|
33
|
+
credit_local_amount2: string | null;
|
|
34
|
+
|
|
35
|
+
currency: string;
|
|
36
|
+
invoice_date: Date;
|
|
37
|
+
value_date: Date;
|
|
38
|
+
description: string | null;
|
|
39
|
+
reference1: string | null;
|
|
40
|
+
locked: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Validation context containing configuration for validation rules
|
|
45
|
+
*
|
|
46
|
+
* Used to pass contextual information to validator functions such as
|
|
47
|
+
* which use-case is being validated and what tolerance to use for
|
|
48
|
+
* balance comparisons.
|
|
49
|
+
*/
|
|
50
|
+
export interface ValidationContext {
|
|
51
|
+
/** Unique identifier of the use-case being validated */
|
|
52
|
+
useCaseId: string;
|
|
53
|
+
|
|
54
|
+
/** Default local currency (e.g., 'ILS') for foreign currency validation */
|
|
55
|
+
defaultCurrency: string;
|
|
56
|
+
|
|
57
|
+
/** Tolerance for floating-point balance comparisons (e.g., 0.01) */
|
|
58
|
+
tolerance: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Entity balance tracking for multi-record entity-level validation
|
|
63
|
+
*
|
|
64
|
+
* Aggregates debit and credit amounts across all ledger records
|
|
65
|
+
* for a specific financial entity to verify the entity's net
|
|
66
|
+
* position balances correctly.
|
|
67
|
+
*/
|
|
68
|
+
export interface EntityBalance {
|
|
69
|
+
/** Financial entity UUID */
|
|
70
|
+
entityId: string;
|
|
71
|
+
|
|
72
|
+
/** Total debit amount in local currency */
|
|
73
|
+
totalDebit: number;
|
|
74
|
+
|
|
75
|
+
/** Total credit amount in local currency */
|
|
76
|
+
totalCredit: number;
|
|
77
|
+
|
|
78
|
+
/** Net balance (totalDebit - totalCredit), should be ~0 */
|
|
79
|
+
netBalance: number;
|
|
80
|
+
|
|
81
|
+
/** Number of ledger records involving this entity */
|
|
82
|
+
recordCount: number;
|
|
83
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { LedgerRecord } from '../demo-fixtures/validators/types.js';
|
|
2
|
+
import type { financial_account_type } from '../modules/financial-accounts/types.js';
|
|
3
|
+
import type { CountryCode, Currency } from '../shared/enums.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Tax Category Mapping for Financial Accounts
|
|
7
|
+
*/
|
|
8
|
+
export interface TaxCategoryMapping {
|
|
9
|
+
taxCategoryId: string;
|
|
10
|
+
currency: Currency;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Business Entity Fixture
|
|
15
|
+
*/
|
|
16
|
+
export interface BusinessFixture {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
country: CountryCode;
|
|
20
|
+
canSettleWithReceipt: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Tax Category Fixture
|
|
25
|
+
*/
|
|
26
|
+
export interface TaxCategoryFixture {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Financial Account Fixture
|
|
33
|
+
*/
|
|
34
|
+
export interface FinancialAccountFixture {
|
|
35
|
+
id: string;
|
|
36
|
+
accountNumber: string;
|
|
37
|
+
type: financial_account_type; // 'BANK_ACCOUNT', 'CREDIT_CARD', etc.
|
|
38
|
+
currency: Currency;
|
|
39
|
+
taxCategoryMappings?: TaxCategoryMapping[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Charge Fixture
|
|
44
|
+
*/
|
|
45
|
+
export interface ChargeFixture {
|
|
46
|
+
id: string;
|
|
47
|
+
ownerId: string; // Supports {{ADMIN_BUSINESS_ID}} placeholder
|
|
48
|
+
userDescription: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Transaction Fixture
|
|
53
|
+
*/
|
|
54
|
+
export interface TransactionFixture {
|
|
55
|
+
id: string;
|
|
56
|
+
chargeId: string;
|
|
57
|
+
businessId: string;
|
|
58
|
+
amount: string; // Decimal as string for precision
|
|
59
|
+
currency: Currency;
|
|
60
|
+
eventDate: string; // ISO date string
|
|
61
|
+
debitDate: string; // ISO date string
|
|
62
|
+
accountNumber: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Document Fixture
|
|
67
|
+
*/
|
|
68
|
+
export interface DocumentFixture {
|
|
69
|
+
id: string;
|
|
70
|
+
chargeId: string;
|
|
71
|
+
creditorId: string;
|
|
72
|
+
debtorId: string; // Supports {{ADMIN_BUSINESS_ID}} placeholder
|
|
73
|
+
serialNumber: string;
|
|
74
|
+
type: string; // 'INVOICE', 'RECEIPT', etc.
|
|
75
|
+
date: string; // ISO date string
|
|
76
|
+
totalAmount: string; // Decimal as string
|
|
77
|
+
currencyCode: Currency;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Tag Fixture (Optional)
|
|
82
|
+
*/
|
|
83
|
+
export interface TagFixture {
|
|
84
|
+
id: string;
|
|
85
|
+
name: string;
|
|
86
|
+
description?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Fixture Collection for a Use-Case
|
|
91
|
+
*/
|
|
92
|
+
export interface FixtureSpec {
|
|
93
|
+
businesses: BusinessFixture[];
|
|
94
|
+
taxCategories: TaxCategoryFixture[];
|
|
95
|
+
financialAccounts: FinancialAccountFixture[];
|
|
96
|
+
charges: ChargeFixture[];
|
|
97
|
+
transactions: TransactionFixture[];
|
|
98
|
+
documents: DocumentFixture[];
|
|
99
|
+
tags?: TagFixture[];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Use-Case Metadata
|
|
104
|
+
*/
|
|
105
|
+
export interface UseCaseMetadata {
|
|
106
|
+
author: string;
|
|
107
|
+
createdAt: string; // ISO date string
|
|
108
|
+
updatedAt: string; // ISO date string
|
|
109
|
+
volumeMultiplier?: number; // Optional: Create N instances (default 1)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Ledger Expectations for Validation
|
|
114
|
+
*/
|
|
115
|
+
export interface UseCaseExpectations {
|
|
116
|
+
ledgerRecordCount: number;
|
|
117
|
+
totalDebitILS?: string; // Decimal as string
|
|
118
|
+
totalCreditILS?: string; // Decimal as string
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Use-Case Category
|
|
123
|
+
*/
|
|
124
|
+
export type UseCaseCategory = 'expenses' | 'income' | 'equity' | 'payroll' | 'other';
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Complete Use-Case Specification
|
|
128
|
+
*/
|
|
129
|
+
export interface UseCaseSpec {
|
|
130
|
+
id: string; // Unique slug: 'monthly-expense-foreign-currency'
|
|
131
|
+
name: string; // Display name: 'Monthly Expense (Foreign Currency)'
|
|
132
|
+
description: string; // Long-form explanation for docs
|
|
133
|
+
category: UseCaseCategory;
|
|
134
|
+
fixtures: FixtureSpec;
|
|
135
|
+
metadata: UseCaseMetadata;
|
|
136
|
+
expectations?: UseCaseExpectations;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Fixture Collection for a Use-Case
|
|
141
|
+
*/
|
|
142
|
+
export interface ExtendedFixtureSpec {
|
|
143
|
+
businesses: BusinessFixture[];
|
|
144
|
+
taxCategories: TaxCategoryFixture[];
|
|
145
|
+
financialAccounts: FinancialAccountFixture[];
|
|
146
|
+
charges: ChargeFixture[];
|
|
147
|
+
transactions: TransactionFixture[];
|
|
148
|
+
documents: DocumentFixture[];
|
|
149
|
+
meta?: {
|
|
150
|
+
id: string;
|
|
151
|
+
description?: string;
|
|
152
|
+
version?: string;
|
|
153
|
+
[key: string]: unknown;
|
|
154
|
+
};
|
|
155
|
+
tags?: TagFixture[];
|
|
156
|
+
expectations?: UseCaseExpectations & { ledger?: LedgerRecord[] };
|
|
157
|
+
placeholders?: Record<string, string>;
|
|
158
|
+
}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
// Mock merge-charges helper before importing providers that use it
|
|
4
|
+
vi.mock('@modules/charges/helpers/merge-charges.helper.js', () => ({
|
|
5
|
+
mergeChargesExecutor: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
|
|
2
8
|
import { createMockTransaction, createMockDocument } from './test-helpers.js';
|
|
3
9
|
|
|
4
10
|
// Mock the module imports to avoid dependency issues
|
|
@@ -99,7 +99,8 @@ describe('Ledger Generation - Expense Scenario A', () => {
|
|
|
99
99
|
try {
|
|
100
100
|
await insertClient.query('BEGIN');
|
|
101
101
|
|
|
102
|
-
await
|
|
102
|
+
const adminContext = await buildAdminContextFromDb(insertClient);
|
|
103
|
+
await insertFixture(insertClient, expenseScenarioA, adminContext.defaultAdminBusinessId);
|
|
103
104
|
|
|
104
105
|
const chargeId = makeUUID('charge', 'charge-office-supplies');
|
|
105
106
|
|
|
@@ -218,10 +219,11 @@ describe('Ledger Generation - Expense Scenario A', () => {
|
|
|
218
219
|
`SELECT * FROM ${qualifyTable('charges')} WHERE id = $1`,
|
|
219
220
|
[chargeId],
|
|
220
221
|
);
|
|
222
|
+
const adminContext = await buildAdminContextFromDb(client);
|
|
221
223
|
if (existingCharge.rows.length === 0) {
|
|
222
224
|
// Reinsert fixture quickly
|
|
223
225
|
await client.query('BEGIN');
|
|
224
|
-
await insertFixture(client, expenseScenarioA);
|
|
226
|
+
await insertFixture(client, expenseScenarioA, adminContext.defaultAdminBusinessId);
|
|
225
227
|
await client.query('COMMIT');
|
|
226
228
|
}
|
|
227
229
|
|
|
@@ -230,7 +232,6 @@ describe('Ledger Generation - Expense Scenario A', () => {
|
|
|
230
232
|
[chargeId],
|
|
231
233
|
);
|
|
232
234
|
const charge = chargeResult.rows[0];
|
|
233
|
-
const adminContext = await buildAdminContextFromDb(client);
|
|
234
235
|
const mockUser: UserType = {
|
|
235
236
|
username: 'test-admin',
|
|
236
237
|
userId: adminContext.defaultAdminBusinessId,
|
|
@@ -104,7 +104,10 @@ describe('Ledger Generation - Expense Scenario B (Foreign Currency)', () => {
|
|
|
104
104
|
try {
|
|
105
105
|
await insertClient.query('BEGIN');
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
// Build AdminContext from database
|
|
108
|
+
const adminContext = await buildAdminContextFromDb(insertClient);
|
|
109
|
+
|
|
110
|
+
await insertFixture(insertClient, expenseScenarioB, adminContext.defaultAdminBusinessId);
|
|
108
111
|
|
|
109
112
|
const chargeId = makeUUID('charge', 'charge-consulting-services');
|
|
110
113
|
|
|
@@ -228,9 +231,10 @@ describe('Ledger Generation - Expense Scenario B (Foreign Currency)', () => {
|
|
|
228
231
|
`SELECT * FROM ${qualifyTable('charges')} WHERE id = $1`,
|
|
229
232
|
[chargeId],
|
|
230
233
|
);
|
|
234
|
+
const adminContext = await buildAdminContextFromDb(client);
|
|
231
235
|
if (existingCharge.rows.length === 0) {
|
|
232
236
|
await client.query('BEGIN');
|
|
233
|
-
await insertFixture(client, expenseScenarioB);
|
|
237
|
+
await insertFixture(client, expenseScenarioB, adminContext.defaultAdminBusinessId);
|
|
234
238
|
await client.query('COMMIT');
|
|
235
239
|
}
|
|
236
240
|
|
|
@@ -239,7 +243,6 @@ describe('Ledger Generation - Expense Scenario B (Foreign Currency)', () => {
|
|
|
239
243
|
[chargeId],
|
|
240
244
|
);
|
|
241
245
|
const charge = chargeResult.rows[0];
|
|
242
|
-
const adminContext = await buildAdminContextFromDb(client);
|
|
243
246
|
const mockUser: UserType = {
|
|
244
247
|
username: 'test-admin-usd',
|
|
245
248
|
userId: adminContext.defaultAdminBusinessId,
|
package/src/shared/constants.ts
CHANGED
|
@@ -4,6 +4,8 @@ export const TIMELESS_DATE_REGEX =
|
|
|
4
4
|
|
|
5
5
|
export const UUID_REGEX =
|
|
6
6
|
/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/;
|
|
7
|
+
export const UUID5_REGEX =
|
|
8
|
+
/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-5[0-9a-fA-F]{3}\b-[89abAB][0-9a-fA-F]{3}\b-[0-9a-fA-F]{12}$/;
|
|
7
9
|
|
|
8
10
|
export const DECREASED_VAT_RATIO = 2 / 3;
|
|
9
11
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { format } from 'date-fns';
|
|
2
|
+
import { UUID_REGEX } from '../constants.js';
|
|
2
3
|
import type { TimelessDateString } from '../types/index.js';
|
|
3
4
|
|
|
4
5
|
function parseIntRound(v: number) {
|
|
@@ -38,9 +39,7 @@ export function isTimelessDateString(date: string): date is TimelessDateString {
|
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
export function isUUID(raw: string) {
|
|
41
|
-
|
|
42
|
-
/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/gi;
|
|
43
|
-
return regexExp.test(raw);
|
|
42
|
+
return UUID_REGEX.test(raw);
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
function convertMonthNameToNumber(monthName: string): string | null {
|