@vrplatform/kysely 1.3.41 → 1.3.45-stage.4321

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/build/main/camel-case/index.js.map +1 -1
  2. package/build/main/control-plane/index.d.ts +142 -0
  3. package/build/main/control-plane/index.js +3 -0
  4. package/build/main/control-plane/index.js.map +1 -0
  5. package/build/main/error.js.map +1 -1
  6. package/build/main/index.d.ts +5 -3
  7. package/build/main/index.js +7 -9
  8. package/build/main/index.js.map +1 -1
  9. package/build/main/isomorphic.js +2 -2
  10. package/build/main/isomorphic.js.map +1 -1
  11. package/build/main/local/digest.js.map +1 -1
  12. package/build/main/local/generate.js.map +1 -1
  13. package/build/main/local/index.js.map +1 -1
  14. package/build/main/local/prune-pulled-schema.js.map +1 -1
  15. package/build/main/pganalyze-comment-plugin/comment-transformer.js +0 -1
  16. package/build/main/pganalyze-comment-plugin/comment-transformer.js.map +1 -1
  17. package/build/main/pganalyze-comment-plugin/index.js +16 -3
  18. package/build/main/pganalyze-comment-plugin/index.js.map +1 -1
  19. package/build/main/plugins.js.map +1 -1
  20. package/build/main/query/listing/status.d.ts +4 -4
  21. package/build/main/query/listing/status.js +2 -1
  22. package/build/main/query/listing/status.js.map +1 -1
  23. package/build/main/regional.d.ts +34 -0
  24. package/build/main/regional.js +145 -0
  25. package/build/main/regional.js.map +1 -0
  26. package/build/main/test/index.js.map +1 -1
  27. package/build/main/transaction.js.map +1 -1
  28. package/build/main/v1.generated.d.ts +19 -1
  29. package/build/main/v1.generated.js.map +1 -1
  30. package/build/migrations/0000000000001-init.ts +5 -0
  31. package/build/migrations/0000000000009-drop-store-schema.ts +14 -0
  32. package/build/migrations/0000000000010-bank-rules.ts +190 -0
  33. package/build/migrations/0000000000011-bank-rule-line-adjustments.ts +65 -0
  34. package/build/migrations/0000000000012-bank-rule-conditions.ts +45 -0
  35. package/build/migrations/0000000000013-bank-rule-name-unique.ts +15 -0
  36. package/build/migrations/0000000000014-bank-rule-drop-legacy-conditions.ts +41 -0
  37. package/build/migrations/0000000000015-booking-channel-logo-dev-provider.ts +70 -0
  38. package/build/migrations/0000000000016-owner-statement-draft-status.ts +22 -0
  39. package/build/migrations/0000000000017-tenant-migration-markers.ts +18 -0
  40. package/build/migrations/0000000000018-security-deposits-payable-category.ts +63 -0
  41. package/build/migrations/0000000000019-tenant-app-settings.ts +76 -0
  42. package/build/migrations/0000000000020-operating-opening-trial-balance.ts +36 -0
  43. package/build/migrations/0000000000021-audit-foreign-key-indexes.ts +77 -0
  44. package/build/migrations/0000000000022-opening-trial-balance-combined-columns.ts +30 -0
  45. package/build/migrations/0000000000023-journal-entry-currency-mismatch-reason.ts +14 -0
  46. package/build/migrations/0000000000024-listing-parent.ts +37 -0
  47. package/build/migrations/0000000000025-journal-entry-parent-listing.ts +26 -0
  48. package/build/migrations/0000000000026-booking-channel-logo-slots.ts +89 -0
  49. package/build/migrations/0000000000027-list-browse-performance-indexes.ts +52 -0
  50. package/build/migrations/0000000000028-flow-setting-status-jsonb.ts +20 -0
  51. package/build/migrations/0000000000029-tenant-slug.ts +328 -0
  52. package/build/migrations/0000000000030-pms-accounting-windows.ts +50 -0
  53. package/build/migrations/0000000000031-owner-statement-projection-listing-revision.ts +20 -0
  54. package/build/migrations/0000000000032-flow-event-listening.ts +28 -0
  55. package/build/migrations/0000000000033-opening-trial-balance-transaction.ts +272 -0
  56. package/build/migrations/0000000000034-historic-general-ledger.ts +24 -0
  57. package/build/migrations/0000000000035-tenant-regional-placement.ts +37 -0
  58. package/build/migrations/0000000000036-control-plane-projection-events.ts +43 -0
  59. package/build/migrations/0000000000037-tenant-guide-onboarding.ts +21 -0
  60. package/build/migrations/0000000000038-tracking-event-analytics-sink.ts +31 -0
  61. package/build/migrations/0000000000039-crunchy-region.ts +86 -0
  62. package/build/migrations/0000000000040-hostaway-region.ts +72 -0
  63. package/build/migrations/0000000000041-audit-tenant-fk.ts +66 -0
  64. package/build/migrations/0000000000042-ramp-staging-connect-params.ts +35 -0
  65. package/build/migrations/0000000000043-gl-pms-accounting-window-guard.ts +125 -0
  66. package/build/migrations/0000000000044-tenant-cross-region-fks.ts +45 -0
  67. package/build/migrations/0000000000045-cloudflare-region-env.ts +100 -0
  68. package/build/migrations/0000000000046-control-plane-outbox-alias.ts +46 -0
  69. package/build/migrations/0000000000047-ramp-contact-last-4-digits.ts +16 -0
  70. package/build/module/camel-case/index.js.map +1 -1
  71. package/build/module/control-plane/index.d.ts +142 -0
  72. package/build/module/control-plane/index.js +2 -0
  73. package/build/module/control-plane/index.js.map +1 -0
  74. package/build/module/error.js.map +1 -1
  75. package/build/module/index.d.ts +5 -3
  76. package/build/module/index.js +7 -9
  77. package/build/module/index.js.map +1 -1
  78. package/build/module/isomorphic.js.map +1 -1
  79. package/build/module/local/digest.js.map +1 -1
  80. package/build/module/local/generate.js.map +1 -1
  81. package/build/module/local/index.js.map +1 -1
  82. package/build/module/local/prune-pulled-schema.js.map +1 -1
  83. package/build/module/pganalyze-comment-plugin/comment-transformer.js.map +1 -1
  84. package/build/module/pganalyze-comment-plugin/index.js.map +1 -1
  85. package/build/module/plugins.js.map +1 -1
  86. package/build/module/query/listing/status.d.ts +4 -4
  87. package/build/module/query/listing/status.js +2 -1
  88. package/build/module/query/listing/status.js.map +1 -1
  89. package/build/module/regional.d.ts +34 -0
  90. package/build/module/regional.js +103 -0
  91. package/build/module/regional.js.map +1 -0
  92. package/build/module/test/index.js.map +1 -1
  93. package/build/module/transaction.js.map +1 -1
  94. package/build/module/v1.generated.d.ts +19 -1
  95. package/build/module/v1.generated.js.map +1 -1
  96. package/package.json +13 -4
  97. package/build/main/tsconfig.main.tsbuildinfo +0 -1
  98. package/build/module/tsconfig.esm.tsbuildinfo +0 -1
@@ -6,6 +6,7 @@ exports.selectListingIsInactive = selectListingIsInactive;
6
6
  exports.selectListingIsActive = selectListingIsActive;
7
7
  exports.selectListingStatus = selectListingStatus;
8
8
  const utils_1 = require("@vrplatform/utils");
9
+ const isomorphic_1 = require("../../isomorphic");
9
10
  function hasActiveTenant(eb) {
10
11
  return eb.exists(eb
11
12
  .selectFrom('public.tenant as tenant')
@@ -24,7 +25,7 @@ function hasInactiveOwnership(eb, today) {
24
25
  return eb.exists(eb
25
26
  .selectFrom('public.listingOwnershipPeriod as lop')
26
27
  .select('lop.id')
27
- .whereRef('lop.listingId', '=', 'l.id')
28
+ .where('lop.listingId', '=', (0, isomorphic_1.sql) `coalesce(${isomorphic_1.sql.ref('l.parentId')}, ${isomorphic_1.sql.ref('l.id')})`)
28
29
  .whereRef('lop.tenantId', '=', 'l.tenantId')
29
30
  .where('lop.setListingInactive', '=', true)
30
31
  .where((eb2) => eb2.or([
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/listing/status.ts"],"names":[],"mappings":"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","sourcesContent":["import { day } from '@vrplatform/utils';\nimport type { DB, ExpressionBuilder, PublicListing } from '../../isomorphic';\n\nfunction hasActiveTenant(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>\n) {\n return eb.exists(\n eb\n .selectFrom('public.tenant as tenant')\n .leftJoin(\n 'public.tenant as billingPartner',\n 'billingPartner.id',\n 'tenant.calculatedBillingPartnerId'\n )\n .select('tenant.id')\n .whereRef('tenant.id', '=', 'l.tenantId')\n .where('tenant.calculatedStatus', '=', 'active')\n .where((eb2) =>\n eb2.or([\n eb2('tenant.calculatedBillingPartnerId', 'is', null),\n eb2('billingPartner.calculatedStatus', '=', 'active'),\n ])\n )\n .limit(1)\n );\n}\n\nfunction hasInactiveOwnership(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n const onDate = day(today).toDate();\n return eb.exists(\n eb\n .selectFrom('public.listingOwnershipPeriod as lop')\n .select('lop.id')\n .whereRef('lop.listingId', '=', 'l.id')\n .whereRef('lop.tenantId', '=', 'l.tenantId')\n .where('lop.setListingInactive', '=', true)\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', '>=', onDate),\n ]),\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', 'is', null),\n ]),\n ])\n )\n .limit(1)\n );\n}\n\nexport function whereListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return hasInactiveOwnership(eb, today);\n}\n\nexport function whereListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb.and([\n hasActiveTenant(eb),\n eb.not(whereListingIsInactive(eb, today)),\n ]);\n}\n\nexport function selectListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsInactive(eb, today);\n}\n\nexport function selectListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsActive(eb, today);\n}\n\nexport function selectListingStatus(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb\n .case()\n .when(whereListingIsInactive(eb, today))\n .then('inactive')\n .else('active')\n .end();\n}\n"]}
1
+ {"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/listing/status.ts"],"names":[],"mappings":"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","sourcesContent":["import { day } from '@vrplatform/utils';\nimport type { DB, ExpressionBuilder, PublicListing } from '../../isomorphic';\nimport { sql } from '../../isomorphic';\n\nfunction hasActiveTenant(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>\n) {\n return eb.exists(\n eb\n .selectFrom('public.tenant as tenant')\n .leftJoin(\n 'public.tenant as billingPartner',\n 'billingPartner.id',\n 'tenant.calculatedBillingPartnerId'\n )\n .select('tenant.id')\n .whereRef('tenant.id', '=', 'l.tenantId')\n .where('tenant.calculatedStatus', '=', 'active')\n .where((eb2) =>\n eb2.or([\n eb2('tenant.calculatedBillingPartnerId', 'is', null),\n eb2('billingPartner.calculatedStatus', '=', 'active'),\n ])\n )\n .limit(1)\n );\n}\n\nfunction hasInactiveOwnership(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n const onDate = day(today).toDate();\n return eb.exists(\n eb\n .selectFrom('public.listingOwnershipPeriod as lop')\n .select('lop.id')\n .where(\n 'lop.listingId',\n '=',\n sql<string>`coalesce(${sql.ref('l.parentId')}, ${sql.ref('l.id')})`\n )\n .whereRef('lop.tenantId', '=', 'l.tenantId')\n .where('lop.setListingInactive', '=', true)\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', '>=', onDate),\n ]),\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', 'is', null),\n ]),\n ])\n )\n .limit(1)\n );\n}\n\nexport function whereListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return hasInactiveOwnership(eb, today);\n}\n\nexport function whereListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb.and([\n hasActiveTenant(eb),\n eb.not(whereListingIsInactive(eb, today)),\n ]);\n}\n\nexport function selectListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsInactive(eb, today);\n}\n\nexport function selectListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsActive(eb, today);\n}\n\nexport function selectListingStatus(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb\n .case()\n .when(whereListingIsInactive(eb, today))\n .then('inactive')\n .else('active')\n .end();\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import type { Kysely } from './index';
2
+ export declare const tenantDataRegions: readonly ["ap", "crunchy", "eu", "hostaway", "us"];
3
+ export type TenantDataRegion = (typeof tenantDataRegions)[number];
4
+ export type RegionEnvironment = Record<string, string | undefined>;
5
+ export declare function assertTenantDataRegion(value: string | undefined): asserts value is TenantDataRegion;
6
+ export declare function resolveTenantDatabaseUrl(dataRegion: TenantDataRegion, env: RegionEnvironment): string;
7
+ export declare function resolveTenantApiBaseUrl(dataRegion: TenantDataRegion, env: RegionEnvironment): string;
8
+ export declare function resolveConfiguredTenantDataRegions(env: RegionEnvironment): ("ap" | "crunchy" | "eu" | "hostaway" | "us")[];
9
+ type UseAsyncRegionalKysely = (connectionString: string, options?: {
10
+ repositoryName?: string;
11
+ probe?: false;
12
+ }) => Promise<Kysely>;
13
+ export declare function useTenantDatabaseKysely(dataRegion: TenantDataRegion, repositoryName: string, env: RegionEnvironment, options?: {
14
+ useAsyncKysely?: UseAsyncRegionalKysely;
15
+ probe?: false;
16
+ }): Promise<Kysely>;
17
+ export type RegionRunError = {
18
+ dataRegion: TenantDataRegion;
19
+ error: string;
20
+ };
21
+ /**
22
+ * Run a job once per configured tenant data region with per-region error
23
+ * isolation: one region's outage must not stall the others (regions iterate
24
+ * in a fixed order, so a failing first region would otherwise starve the
25
+ * rest on every attempt). Throws only when every configured region failed.
26
+ */
27
+ export declare function forEachConfiguredRegion<T>(run: (dataRegion: TenantDataRegion) => Promise<T>, env: RegionEnvironment): Promise<{
28
+ results: {
29
+ dataRegion: TenantDataRegion;
30
+ result: T;
31
+ }[];
32
+ errors: RegionRunError[];
33
+ }>;
34
+ export {};
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.tenantDataRegions = void 0;
37
+ exports.assertTenantDataRegion = assertTenantDataRegion;
38
+ exports.resolveTenantDatabaseUrl = resolveTenantDatabaseUrl;
39
+ exports.resolveTenantApiBaseUrl = resolveTenantApiBaseUrl;
40
+ exports.resolveConfiguredTenantDataRegions = resolveConfiguredTenantDataRegions;
41
+ exports.useTenantDatabaseKysely = useTenantDatabaseKysely;
42
+ exports.forEachConfiguredRegion = forEachConfiguredRegion;
43
+ // The tenant-data-region contract lives here — the region set plus how a
44
+ // region resolves to its database url, API base url, and how to fan a job out
45
+ // across regions. Every runtime resolves regions through these functions;
46
+ // @vrplatform/common re-exports them for app-facing imports, and the trigger
47
+ // runtime wraps them only to default `env` to process.env.
48
+ //
49
+ // Region → resource keys are derived from the region name
50
+ // (`DATABASE_URL_VRTRUST_<REGION>`, `API_BASE_URL_<REGION>`), so adding a
51
+ // region means extending this array plus its env values and migrations — not
52
+ // editing per-region branches.
53
+ exports.tenantDataRegions = [
54
+ 'ap',
55
+ 'crunchy',
56
+ 'eu',
57
+ 'hostaway',
58
+ 'us',
59
+ ];
60
+ function assertTenantDataRegion(value) {
61
+ if (!exports.tenantDataRegions.includes(value)) {
62
+ throw new Error(`Missing or invalid tenant data region: ${value ?? ''}`);
63
+ }
64
+ }
65
+ function databaseUrlEnvKey(dataRegion) {
66
+ return `DATABASE_URL_VRTRUST_${dataRegion.toUpperCase()}`;
67
+ }
68
+ function apiBaseUrlEnvKey(dataRegion) {
69
+ return `API_BASE_URL_${dataRegion.toUpperCase()}`;
70
+ }
71
+ function resolveTenantDatabaseUrl(dataRegion, env) {
72
+ const databaseUrl = env[databaseUrlEnvKey(dataRegion)];
73
+ if (!databaseUrl) {
74
+ throw new Error(`Missing database url for ${dataRegion}`);
75
+ }
76
+ return databaseUrl;
77
+ }
78
+ function resolveTenantApiBaseUrl(dataRegion, env) {
79
+ const key = apiBaseUrlEnvKey(dataRegion);
80
+ const baseUrl = env[key];
81
+ if (!baseUrl) {
82
+ throw new Error(`Missing ${key}`);
83
+ }
84
+ return baseUrl;
85
+ }
86
+ function resolveConfiguredTenantDataRegions(env) {
87
+ const configured = exports.tenantDataRegions.filter((region) => Boolean(env[databaseUrlEnvKey(region)]));
88
+ if (!configured.length) {
89
+ throw new Error('No tenant data region database urls configured');
90
+ }
91
+ // Two regions sharing one URL means every region-fan-out job scans the
92
+ // same physical DB twice (e.g. a stale dashboard env var re-merged into a
93
+ // deploy). Regions must stay unset until they point at distinct databases.
94
+ const regionsByUrl = new Map();
95
+ for (const region of configured) {
96
+ const url = env[databaseUrlEnvKey(region)];
97
+ regionsByUrl.set(url, [...(regionsByUrl.get(url) ?? []), region]);
98
+ }
99
+ for (const aliased of regionsByUrl.values()) {
100
+ if (aliased.length > 1) {
101
+ throw new Error(`Tenant data regions ${aliased.join(', ')} share the same database url; ` +
102
+ 'each configured region must point at a distinct database');
103
+ }
104
+ }
105
+ return configured;
106
+ }
107
+ async function defaultUseAsyncKysely(connectionString, options) {
108
+ const { useAsyncKysely } = await Promise.resolve().then(() => __importStar(require('./index')));
109
+ return await useAsyncKysely(connectionString, options);
110
+ }
111
+ async function useTenantDatabaseKysely(dataRegion, repositoryName, env, options = {}) {
112
+ const open = options.useAsyncKysely ?? defaultUseAsyncKysely;
113
+ return await open(resolveTenantDatabaseUrl(dataRegion, env), {
114
+ repositoryName,
115
+ probe: options.probe,
116
+ });
117
+ }
118
+ /**
119
+ * Run a job once per configured tenant data region with per-region error
120
+ * isolation: one region's outage must not stall the others (regions iterate
121
+ * in a fixed order, so a failing first region would otherwise starve the
122
+ * rest on every attempt). Throws only when every configured region failed.
123
+ */
124
+ async function forEachConfiguredRegion(run, env) {
125
+ const results = [];
126
+ const errors = [];
127
+ for (const dataRegion of resolveConfiguredTenantDataRegions(env)) {
128
+ try {
129
+ results.push({ dataRegion, result: await run(dataRegion) });
130
+ }
131
+ catch (error) {
132
+ errors.push({
133
+ dataRegion,
134
+ error: error instanceof Error ? error.message : String(error),
135
+ });
136
+ }
137
+ }
138
+ if (!results.length && errors.length) {
139
+ throw new Error(`All configured tenant data regions failed: ${errors
140
+ .map((regionError) => `${regionError.dataRegion}: ${regionError.error}`)
141
+ .join('; ')}`);
142
+ }
143
+ return { results, errors };
144
+ }
145
+ //# sourceMappingURL=regional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regional.js","sourceRoot":"src/","sources":["regional.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Kysely } from './index';\n\n// The tenant-data-region contract lives here — the region set plus how a\n// region resolves to its database url, API base url, and how to fan a job out\n// across regions. Every runtime resolves regions through these functions;\n// @vrplatform/common re-exports them for app-facing imports, and the trigger\n// runtime wraps them only to default `env` to process.env.\n//\n// Region → resource keys are derived from the region name\n// (`DATABASE_URL_VRTRUST_<REGION>`, `API_BASE_URL_<REGION>`), so adding a\n// region means extending this array plus its env values and migrations — not\n// editing per-region branches.\nexport const tenantDataRegions = [\n 'ap',\n 'crunchy',\n 'eu',\n 'hostaway',\n 'us',\n] as const;\nexport type TenantDataRegion = (typeof tenantDataRegions)[number];\n\nexport type RegionEnvironment = Record<string, string | undefined>;\n\nexport function assertTenantDataRegion(\n value: string | undefined\n): asserts value is TenantDataRegion {\n if (!tenantDataRegions.includes(value as TenantDataRegion)) {\n throw new Error(`Missing or invalid tenant data region: ${value ?? ''}`);\n }\n}\n\nfunction databaseUrlEnvKey(dataRegion: TenantDataRegion) {\n return `DATABASE_URL_VRTRUST_${dataRegion.toUpperCase()}`;\n}\n\nfunction apiBaseUrlEnvKey(dataRegion: TenantDataRegion) {\n return `API_BASE_URL_${dataRegion.toUpperCase()}`;\n}\n\nexport function resolveTenantDatabaseUrl(\n dataRegion: TenantDataRegion,\n env: RegionEnvironment\n) {\n const databaseUrl = env[databaseUrlEnvKey(dataRegion)];\n if (!databaseUrl) {\n throw new Error(`Missing database url for ${dataRegion}`);\n }\n return databaseUrl;\n}\n\nexport function resolveTenantApiBaseUrl(\n dataRegion: TenantDataRegion,\n env: RegionEnvironment\n) {\n const key = apiBaseUrlEnvKey(dataRegion);\n const baseUrl = env[key];\n if (!baseUrl) {\n throw new Error(`Missing ${key}`);\n }\n return baseUrl;\n}\n\nexport function resolveConfiguredTenantDataRegions(env: RegionEnvironment) {\n const configured = tenantDataRegions.filter((region) =>\n Boolean(env[databaseUrlEnvKey(region)])\n );\n\n if (!configured.length) {\n throw new Error('No tenant data region database urls configured');\n }\n\n // Two regions sharing one URL means every region-fan-out job scans the\n // same physical DB twice (e.g. a stale dashboard env var re-merged into a\n // deploy). Regions must stay unset until they point at distinct databases.\n const regionsByUrl = new Map<string, TenantDataRegion[]>();\n for (const region of configured) {\n const url = env[databaseUrlEnvKey(region)]!;\n regionsByUrl.set(url, [...(regionsByUrl.get(url) ?? []), region]);\n }\n for (const aliased of regionsByUrl.values()) {\n if (aliased.length > 1) {\n throw new Error(\n `Tenant data regions ${aliased.join(', ')} share the same database url; ` +\n 'each configured region must point at a distinct database'\n );\n }\n }\n\n return configured;\n}\n\ntype UseAsyncRegionalKysely = (\n connectionString: string,\n options?: {\n repositoryName?: string;\n probe?: false;\n }\n) => Promise<Kysely>;\n\nasync function defaultUseAsyncKysely(\n connectionString: string,\n options?: Parameters<UseAsyncRegionalKysely>[1]\n) {\n const { useAsyncKysely } = await import('./index');\n return await useAsyncKysely(connectionString, options);\n}\n\nexport async function useTenantDatabaseKysely(\n dataRegion: TenantDataRegion,\n repositoryName: string,\n env: RegionEnvironment,\n options: { useAsyncKysely?: UseAsyncRegionalKysely; probe?: false } = {}\n) {\n const open = options.useAsyncKysely ?? defaultUseAsyncKysely;\n return await open(resolveTenantDatabaseUrl(dataRegion, env), {\n repositoryName,\n probe: options.probe,\n });\n}\n\nexport type RegionRunError = {\n dataRegion: TenantDataRegion;\n error: string;\n};\n\n/**\n * Run a job once per configured tenant data region with per-region error\n * isolation: one region's outage must not stall the others (regions iterate\n * in a fixed order, so a failing first region would otherwise starve the\n * rest on every attempt). Throws only when every configured region failed.\n */\nexport async function forEachConfiguredRegion<T>(\n run: (dataRegion: TenantDataRegion) => Promise<T>,\n env: RegionEnvironment\n): Promise<{\n results: { dataRegion: TenantDataRegion; result: T }[];\n errors: RegionRunError[];\n}> {\n const results: { dataRegion: TenantDataRegion; result: T }[] = [];\n const errors: RegionRunError[] = [];\n\n for (const dataRegion of resolveConfiguredTenantDataRegions(env)) {\n try {\n results.push({ dataRegion, result: await run(dataRegion) });\n } catch (error) {\n errors.push({\n dataRegion,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n if (!results.length && errors.length) {\n throw new Error(\n `All configured tenant data regions failed: ${errors\n .map((regionError) => `${regionError.dataRegion}: ${regionError.error}`)\n .join('; ')}`\n );\n }\n\n return { results, errors };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"src/","sources":["test/index.ts"],"names":[],"mappings":";;;;;AAAA,uCAAoC;AAEpC,oCAAsE;AAYtE;;GAEG;AACI,KAAK,wBACV,eAA2B,EAC3B,IAA4B,EAC5B;IACA,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;IAE1C,IAAI,eAAe,KAAK,UAAU;QAChC,IAAA,mBAAQ,EAAC,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAAA,CACxB,CAAC,CAAC;IAEL,OAAO;QACL,MAAM;KACP,CAAC;AAAA,CACH;AAEM,KAAK,mCAAmC,IAA4B,EAAE;IAC3E,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,UAAU,CAAC,6BAA6B,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;YACrC,UAAU,CAAC,6BAA6B,GAAG,OAAO,CAAC;YACnD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,QAAQ,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;IAE1C,IAAA,mBAAQ,EAAC,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAAA,CACxB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAAA,CACf;AAMM,KAAK,iCACV,IAA4B,EACP;IACrB,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;IAE1C,OAAO,IAAI,KAAK,CACd,EAAE,EACF;QACE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE;YACjB,8CAA8C;YAC9C,IAAI,IAAI,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;gBACjC,OAAO,KAAK,IAAI,EAAE,CAAC;oBACjB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAA,CACxB,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;gBACvC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAAA,CACrB;KACF,CACY,CAAC;AAAA,CACjB","sourcesContent":["import { afterAll } from 'bun:test';\nimport type { Kysely } from 'kysely';\nimport { type UseLocalKyselyOptions, useLocalKysely } from '../local';\nimport type { DB } from '../v1.generated';\n\ndeclare global {\n // Shared Kysely instance for test processes that run multiple files in one Bun process.\n // This must be process-global to allow cross-file reuse.\n var __vrplatform_testSharedKysely:\n | Promise<Kysely<DB>>\n | Kysely<DB>\n | undefined;\n}\n\n/**\n * @deprecated Use `useLocalKyselyResource` instead.\n */\nexport async function useTestKysely(\n cleanupStrategy: 'afterAll',\n args?: UseLocalKyselyOptions\n) {\n const kysely = await useLocalKysely(args);\n\n if (cleanupStrategy === 'afterAll')\n afterAll(async () => {\n await kysely.destroy();\n });\n\n return {\n kysely,\n };\n}\n\nexport async function useTestAutoCleanupKysely(args?: UseLocalKyselyOptions) {\n if (process.env.VR_TEST_SHARED_KYSELY === '1') {\n const existing = globalThis.__vrplatform_testSharedKysely;\n if (!existing) {\n const created = useLocalKysely(args);\n globalThis.__vrplatform_testSharedKysely = created;\n return created;\n }\n return await existing;\n }\n\n const kysely = await useLocalKysely(args);\n\n afterAll(async () => {\n await kysely.destroy();\n });\n\n return kysely;\n}\n\ntype ReturnType = Kysely<DB> & {\n [Symbol.dispose]: () => Promise<void>;\n};\n\nexport async function useLocalKyselyResource(\n args?: UseLocalKyselyOptions\n): Promise<ReturnType> {\n const kysely = await useLocalKysely(args);\n\n return new Proxy(\n {},\n {\n get(_target, prop) {\n // somehow not working if using Symbol.dispose\n if (prop === Symbol.asyncDispose) {\n return async () => {\n await kysely.destroy();\n };\n }\n if (prop === 'kysely') {\n return kysely;\n }\n if (typeof kysely[prop] === 'function') {\n return kysely[prop].bind(kysely);\n }\n return kysely[prop];\n },\n }\n ) as ReturnType;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["test/index.ts"],"names":[],"mappings":";;AAiBA,sCAcC;AAED,4DAkBC;AAMD,wDAyBC;AAlFD,uCAAoC;AAEpC,oCAAsE;AAYtE;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,eAA2B,EAC3B,IAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;IAE1C,IAAI,eAAe,KAAK,UAAU;QAChC,IAAA,mBAAQ,EAAC,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAAC,IAA4B;IACzE,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,UAAU,CAAC,6BAA6B,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;YACrC,UAAU,CAAC,6BAA6B,GAAG,OAAO,CAAC;YACnD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,QAAQ,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;IAE1C,IAAA,mBAAQ,EAAC,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAMM,KAAK,UAAU,sBAAsB,CAC1C,IAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAC;IAE1C,OAAO,IAAI,KAAK,CACd,EAAE,EACF;QACE,GAAG,CAAC,OAAO,EAAE,IAAI;YACf,8CAA8C;YAC9C,IAAI,IAAI,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;gBACjC,OAAO,KAAK,IAAI,EAAE;oBAChB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;gBACvC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;KACF,CACY,CAAC;AAClB,CAAC","sourcesContent":["import { afterAll } from 'bun:test';\nimport type { Kysely } from 'kysely';\nimport { type UseLocalKyselyOptions, useLocalKysely } from '../local';\nimport type { DB } from '../v1.generated';\n\ndeclare global {\n // Shared Kysely instance for test processes that run multiple files in one Bun process.\n // This must be process-global to allow cross-file reuse.\n var __vrplatform_testSharedKysely:\n | Promise<Kysely<DB>>\n | Kysely<DB>\n | undefined;\n}\n\n/**\n * @deprecated Use `useLocalKyselyResource` instead.\n */\nexport async function useTestKysely(\n cleanupStrategy: 'afterAll',\n args?: UseLocalKyselyOptions\n) {\n const kysely = await useLocalKysely(args);\n\n if (cleanupStrategy === 'afterAll')\n afterAll(async () => {\n await kysely.destroy();\n });\n\n return {\n kysely,\n };\n}\n\nexport async function useTestAutoCleanupKysely(args?: UseLocalKyselyOptions) {\n if (process.env.VR_TEST_SHARED_KYSELY === '1') {\n const existing = globalThis.__vrplatform_testSharedKysely;\n if (!existing) {\n const created = useLocalKysely(args);\n globalThis.__vrplatform_testSharedKysely = created;\n return created;\n }\n return await existing;\n }\n\n const kysely = await useLocalKysely(args);\n\n afterAll(async () => {\n await kysely.destroy();\n });\n\n return kysely;\n}\n\ntype ReturnType = Kysely<DB> & {\n [Symbol.dispose]: () => Promise<void>;\n};\n\nexport async function useLocalKyselyResource(\n args?: UseLocalKyselyOptions\n): Promise<ReturnType> {\n const kysely = await useLocalKysely(args);\n\n return new Proxy(\n {},\n {\n get(_target, prop) {\n // somehow not working if using Symbol.dispose\n if (prop === Symbol.asyncDispose) {\n return async () => {\n await kysely.destroy();\n };\n }\n if (prop === 'kysely') {\n return kysely;\n }\n if (typeof kysely[prop] === 'function') {\n return kysely[prop].bind(kysely);\n }\n return kysely[prop];\n },\n }\n ) as ReturnType;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"src/","sources":["transaction.ts"],"names":[],"mappings":";;;;;;;AAAA,6CAKsB;AAItB,6BACE,EAA8B,EACL;IACzB,OAAO,EAAE,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,CACnC;AAEM,KAAK,qCAAqC,EAAU,EAAE;IAC3D,OAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC;AAAA,CACxC;AAED,uEAAuE;AACvE,kDAAkD;AAClD,SAAS,mBAAmB,CAC1B,GAAgB,EAChB,OAAoE,EACpE,aAAqB,EACrB;IACA,OAAO,gBAAG,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAAA,CAC5D;AAEM,KAAK,qCACV,GAAsB,EACtB,aAAqB,EACO;IAC5B,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC;AAAA,CACZ;AAEM,KAAK,uCACV,GAAsB,EACtB,aAAqB,EACO;IAC5B,MAAM,mBAAmB,CAAC,GAAG,EAAE,uBAAuB,EAAE,aAAa,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC;AAAA,CACZ;AAEM,KAAK,sCACV,GAAsB,EACtB,aAAqB,EACO;IAC5B,MAAM,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC;AAAA,CACZ","sourcesContent":["import {\n type ControlledTransaction,\n type Kysely,\n sql,\n type Transaction,\n} from './isomorphic';\n\nexport type ActiveTransaction = Transaction | ControlledTransaction;\n\nexport function isActiveTransaction(\n db: Kysely | ActiveTransaction\n): db is ActiveTransaction {\n return db?.isTransaction === true;\n}\n\nexport async function startControlledTransaction(db: Kysely) {\n return db.startTransaction().execute();\n}\n\n// Our dialect stack supports controlled transactions, but not Kysely's\n// savepoint commands consistently across drivers.\nfunction runSavepointCommand(\n trx: Transaction,\n command: 'savepoint' | 'rollback to savepoint' | 'release savepoint',\n savepointName: string\n) {\n return sql.raw(`${command} ${savepointName}`).execute(trx);\n}\n\nexport async function createTransactionSavepoint(\n trx: ActiveTransaction,\n savepointName: string\n): Promise<ActiveTransaction> {\n await runSavepointCommand(trx, 'savepoint', savepointName);\n return trx;\n}\n\nexport async function rollbackTransactionSavepoint(\n trx: ActiveTransaction,\n savepointName: string\n): Promise<ActiveTransaction> {\n await runSavepointCommand(trx, 'rollback to savepoint', savepointName);\n return trx;\n}\n\nexport async function releaseTransactionSavepoint(\n trx: ActiveTransaction,\n savepointName: string\n): Promise<ActiveTransaction> {\n await runSavepointCommand(trx, 'release savepoint', savepointName);\n return trx;\n}\n"]}
1
+ {"version":3,"file":"transaction.js","sourceRoot":"src/","sources":["transaction.ts"],"names":[],"mappings":";;AASA,kDAIC;AAED,gEAEC;AAYD,gEAMC;AAED,oEAMC;AAED,kEAMC;AAnDD,6CAKsB;AAItB,SAAgB,mBAAmB,CACjC,EAA8B;IAE9B,OAAO,EAAE,EAAE,aAAa,KAAK,IAAI,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,0BAA0B,CAAC,EAAU;IACzD,OAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,uEAAuE;AACvE,kDAAkD;AAClD,SAAS,mBAAmB,CAC1B,GAAgB,EAChB,OAAoE,EACpE,aAAqB;IAErB,OAAO,gBAAG,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC;AAEM,KAAK,UAAU,0BAA0B,CAC9C,GAAsB,EACtB,aAAqB;IAErB,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC;AAEM,KAAK,UAAU,4BAA4B,CAChD,GAAsB,EACtB,aAAqB;IAErB,MAAM,mBAAmB,CAAC,GAAG,EAAE,uBAAuB,EAAE,aAAa,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC;AACb,CAAC;AAEM,KAAK,UAAU,2BAA2B,CAC/C,GAAsB,EACtB,aAAqB;IAErB,MAAM,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import {\n type ControlledTransaction,\n type Kysely,\n sql,\n type Transaction,\n} from './isomorphic';\n\nexport type ActiveTransaction = Transaction | ControlledTransaction;\n\nexport function isActiveTransaction(\n db: Kysely | ActiveTransaction\n): db is ActiveTransaction {\n return db?.isTransaction === true;\n}\n\nexport async function startControlledTransaction(db: Kysely) {\n return db.startTransaction().execute();\n}\n\n// Our dialect stack supports controlled transactions, but not Kysely's\n// savepoint commands consistently across drivers.\nfunction runSavepointCommand(\n trx: Transaction,\n command: 'savepoint' | 'rollback to savepoint' | 'release savepoint',\n savepointName: string\n) {\n return sql.raw(`${command} ${savepointName}`).execute(trx);\n}\n\nexport async function createTransactionSavepoint(\n trx: ActiveTransaction,\n savepointName: string\n): Promise<ActiveTransaction> {\n await runSavepointCommand(trx, 'savepoint', savepointName);\n return trx;\n}\n\nexport async function rollbackTransactionSavepoint(\n trx: ActiveTransaction,\n savepointName: string\n): Promise<ActiveTransaction> {\n await runSavepointCommand(trx, 'rollback to savepoint', savepointName);\n return trx;\n}\n\nexport async function releaseTransactionSavepoint(\n trx: ActiveTransaction,\n savepointName: string\n): Promise<ActiveTransaction> {\n await runSavepointCommand(trx, 'release savepoint', savepointName);\n return trx;\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * Please do not edit it manually.
4
4
  */
5
5
  import type { ColumnType } from "kysely";
6
- export type AccountingJournalEntryInactiveReason = "cancelledReservationLine" | "generalLedgerStartAt" | "inactiveAccount" | "listingInactive" | "nonPostingAccount" | "reservationGeneralLedgerStatusInactive" | "transactionInactive" | "unknownInactiveReason";
6
+ export type AccountingJournalEntryInactiveReason = "cancelledReservationLine" | "currencyMismatch" | "generalLedgerStartAt" | "inactiveAccount" | "listingInactive" | "nonPostingAccount" | "reservationGeneralLedgerStatusInactive" | "transactionInactive" | "unknownInactiveReason";
7
7
  export type AccountingJournalEntryLedger = "historical" | "operating" | "trust";
8
8
  export type AccountingTransactionAttachmentStatus = "attached" | "deleting" | "ready" | "uploading";
9
9
  export type AuditActionActorType = "automation" | "sync" | "system" | "user";
@@ -36,6 +36,8 @@ export interface AccountingAccount {
36
36
  createdAt: Generated<Timestamp | null>;
37
37
  id: Generated<string>;
38
38
  offsetAccountId: string | null;
39
+ openingTrialBalanceCombinedCentTotal: Generated<Int8>;
40
+ openingTrialBalanceUpdatedAt: Timestamp | null;
39
41
  status: Generated<string>;
40
42
  tenantId: string | null;
41
43
  title: string;
@@ -240,6 +242,7 @@ export interface AccountingContact {
240
242
  is1099PostalDelivery: Generated<boolean>;
241
243
  name: string;
242
244
  phone: string | null;
245
+ rampLast4Digits: string | null;
243
246
  /**
244
247
  * Human-readable system ID (CNT-XXX-XXXX-XXX).
245
248
  */
@@ -278,6 +281,7 @@ export interface AccountingJournalEntry {
278
281
  lineUniqueRef: string | null;
279
282
  listingId: string | null;
280
283
  listingOwnershipPeriodId: string | null;
284
+ parentListingId: string | null;
281
285
  party: string | null;
282
286
  recurringFeeId: string | null;
283
287
  recurringFeeListingSubscriptionId: string | null;
@@ -579,6 +583,7 @@ export interface CoreChangeType {
579
583
  export interface CoreFlow {
580
584
  appId: string;
581
585
  description: string | null;
586
+ eventListening: Generated<Json>;
582
587
  id: Generated<string>;
583
588
  isPublic: Generated<boolean>;
584
589
  leftType: string | null;
@@ -890,7 +895,10 @@ export interface PublicBookingChannel {
890
895
  iconProvider: string | null;
891
896
  id: Generated<string>;
892
897
  lastGenerateRun: Timestamp | null;
898
+ logo: string | null;
899
+ logoProvider: string | null;
893
900
  selectedBookingChannelIconCandidateId: string | null;
901
+ selectedBookingChannelLogoCandidateId: string | null;
894
902
  uniqueRef: string;
895
903
  updatedAt: Generated<Timestamp>;
896
904
  }
@@ -901,12 +909,16 @@ export interface PublicBookingChannelIconCandidate {
901
909
  comment: string | null;
902
910
  createdAt: Generated<Timestamp>;
903
911
  externalIcon: string | null;
912
+ height: number | null;
904
913
  id: Generated<string>;
905
914
  provider: Generated<string>;
906
915
  source: string | null;
907
916
  updatedAt: Generated<Timestamp>;
917
+ width: number | null;
908
918
  }
909
919
  export interface PublicConnection {
920
+ accountingEndAt: Timestamp | null;
921
+ accountingStartAt: Timestamp | null;
910
922
  appId: string;
911
923
  backendVersion: number | null;
912
924
  createdAt: Generated<Timestamp>;
@@ -1053,6 +1065,7 @@ export interface PublicListing {
1053
1065
  metadata: Generated<Json | null>;
1054
1066
  name: string | null;
1055
1067
  ownerContactId: string | null;
1068
+ parentId: string | null;
1056
1069
  pmsAddressData: Json | null;
1057
1070
  pmsStatus: string | null;
1058
1071
  /**
@@ -1590,6 +1603,7 @@ export interface PublicTenant {
1590
1603
  addressCountry: string | null;
1591
1604
  addressLine1: string | null;
1592
1605
  addressPostcode: string | null;
1606
+ appSettings: Json | null;
1593
1607
  billingAddressData: Json | null;
1594
1608
  billingAddressId: string | null;
1595
1609
  billingCustomerId: string | null;
@@ -1612,10 +1626,12 @@ export interface PublicTenant {
1612
1626
  companyName: string | null;
1613
1627
  companyTaxCode: string | null;
1614
1628
  createdAt: Generated<Timestamp>;
1629
+ dataRegion: Generated<string>;
1615
1630
  defaultCurrency: string | null;
1616
1631
  defaultRevenueRecognition: string | null;
1617
1632
  email: string | null;
1618
1633
  featureFlags: Generated<Json | null>;
1634
+ guideOnboarding: Json | null;
1619
1635
  historicalStatementsImportedAt: Timestamp | null;
1620
1636
  id: Generated<string>;
1621
1637
  intercomId: string | null;
@@ -1635,10 +1651,12 @@ export interface PublicTenant {
1635
1651
  settingsData: Json | null;
1636
1652
  setup: Json | null;
1637
1653
  setupCompleted: Generated<boolean | null>;
1654
+ slug: Generated<string>;
1638
1655
  statementAddressData: Json | null;
1639
1656
  statementAddressId: string | null;
1640
1657
  statementStartAt: Timestamp | null;
1641
1658
  status: Generated<string | null>;
1659
+ storageRealm: Generated<string>;
1642
1660
  stripeId: string | null;
1643
1661
  stripeSubscriptionItemId: string | null;
1644
1662
  supportEmail: string | null;