diff --git a/src/app/api/public/interests/route.ts b/src/app/api/public/interests/route.ts
index fbef94f..dcb9687 100644
--- a/src/app/api/public/interests/route.ts
+++ b/src/app/api/public/interests/route.ts
@@ -144,7 +144,6 @@ export async function POST(req: NextRequest) {
name: data.company.name,
legalName: data.company.legalName ?? null,
taxId: data.company.taxId ?? null,
- incorporationCountry: data.company.incorporationCountry ?? null,
incorporationCountryIso: data.company.incorporationCountryIso ?? null,
incorporationSubdivisionIso: data.company.incorporationSubdivisionIso ?? null,
status: 'active',
@@ -216,10 +215,8 @@ export async function POST(req: NextRequest) {
label: 'Primary',
streetAddress: data.address.street ?? null,
city: data.address.city ?? null,
- stateProvince: data.address.stateProvince ?? null,
subdivisionIso: data.address.subdivisionIso ?? null,
postalCode: data.address.postalCode ?? null,
- country: data.address.country ?? null,
countryIso: data.address.countryIso ?? null,
isPrimary: true,
});
diff --git a/src/components/clients/client-columns.tsx b/src/components/clients/client-columns.tsx
index 9c8d568..c8614a2 100644
--- a/src/components/clients/client-columns.tsx
+++ b/src/components/clients/client-columns.tsx
@@ -14,11 +14,12 @@ import {
} from '@/components/ui/dropdown-menu';
import { Badge } from '@/components/ui/badge';
import { TagBadge } from '@/components/shared/tag-badge';
+import { getCountryName } from '@/lib/i18n/countries';
export interface ClientRow {
id: string;
fullName: string;
- nationality: string | null;
+ nationalityIso: string | null;
source: string | null;
archivedAt: string | null;
createdAt: string;
@@ -78,11 +79,14 @@ export function getClientColumns({
},
{
id: 'nationality',
- accessorKey: 'nationality',
+ accessorKey: 'nationalityIso',
header: 'Nationality',
- cell: ({ getValue }) => (
- {(getValue() as string | null) ?? '—'}
- ),
+ cell: ({ getValue }) => {
+ const iso = getValue() as string | null;
+ return (
+ {iso ? getCountryName(iso, 'en') : '—'}
+ );
+ },
},
{
id: 'source',
diff --git a/src/components/clients/client-detail.tsx b/src/components/clients/client-detail.tsx
index 42ca1fa..bfe72b8 100644
--- a/src/components/clients/client-detail.tsx
+++ b/src/components/clients/client-detail.tsx
@@ -12,7 +12,7 @@ interface ClientData {
id: string;
portId: string;
fullName: string;
- nationality: string | null;
+ nationalityIso: string | null;
preferredContactMethod: string | null;
preferredLanguage: string | null;
timezone: string | null;
diff --git a/src/components/clients/client-form.tsx b/src/components/clients/client-form.tsx
index 5f34851..5d665f9 100644
--- a/src/components/clients/client-form.tsx
+++ b/src/components/clients/client-form.tsx
@@ -34,7 +34,6 @@ interface ClientFormProps {
client?: {
id: string;
fullName: string;
- nationality?: string | null;
nationalityIso?: string | null;
preferredContactMethod?: string | null;
preferredLanguage?: string | null;
@@ -83,7 +82,6 @@ export function ClientForm({ open, onOpenChange, client }: ClientFormProps) {
if (client && open) {
reset({
fullName: client.fullName,
- nationality: client.nationality ?? undefined,
nationalityIso: client.nationalityIso ?? undefined,
preferredContactMethod:
(client.preferredContactMethod as CreateClientInput['preferredContactMethod']) ??
diff --git a/src/components/companies/company-columns.tsx b/src/components/companies/company-columns.tsx
index 54c87a6..fead737 100644
--- a/src/components/companies/company-columns.tsx
+++ b/src/components/companies/company-columns.tsx
@@ -19,7 +19,6 @@ export interface CompanyRow {
legalName: string | null;
taxId: string | null;
registrationNumber: string | null;
- incorporationCountry: string | null;
incorporationCountryIso: string | null;
incorporationSubdivisionIso: string | null;
incorporationDate: string | null;
diff --git a/src/components/companies/company-detail-header.tsx b/src/components/companies/company-detail-header.tsx
index 79c9bbe..ebf5a92 100644
--- a/src/components/companies/company-detail-header.tsx
+++ b/src/components/companies/company-detail-header.tsx
@@ -20,7 +20,6 @@ interface CompanyDetailHeaderCompany {
legalName: string | null;
taxId: string | null;
registrationNumber: string | null;
- incorporationCountry: string | null;
incorporationCountryIso: string | null;
incorporationSubdivisionIso: string | null;
incorporationDate: string | null;
@@ -132,7 +131,6 @@ export function CompanyDetailHeader({ company }: CompanyDetailHeaderProps) {
legalName: company.legalName,
taxId: company.taxId,
registrationNumber: company.registrationNumber,
- incorporationCountry: company.incorporationCountry,
incorporationCountryIso: company.incorporationCountryIso,
incorporationSubdivisionIso: company.incorporationSubdivisionIso,
incorporationDate: company.incorporationDate,
diff --git a/src/components/companies/company-detail.tsx b/src/components/companies/company-detail.tsx
index 0731277..41c7ec8 100644
--- a/src/components/companies/company-detail.tsx
+++ b/src/components/companies/company-detail.tsx
@@ -16,7 +16,6 @@ export interface CompanyData {
legalName: string | null;
taxId: string | null;
registrationNumber: string | null;
- incorporationCountry: string | null;
incorporationCountryIso: string | null;
incorporationSubdivisionIso: string | null;
incorporationDate: string | null;
diff --git a/src/components/companies/company-form.tsx b/src/components/companies/company-form.tsx
index dd3dc1c..3f2fa1a 100644
--- a/src/components/companies/company-form.tsx
+++ b/src/components/companies/company-form.tsx
@@ -41,7 +41,6 @@ interface CompanyFormProps {
legalName: string | null;
taxId: string | null;
registrationNumber: string | null;
- incorporationCountry: string | null;
incorporationCountryIso: string | null;
incorporationSubdivisionIso: string | null;
incorporationDate: string | null;
@@ -83,7 +82,6 @@ export function CompanyForm({ open, onOpenChange, company }: CompanyFormProps) {
legalName: company.legalName ?? undefined,
taxId: company.taxId ?? undefined,
registrationNumber: company.registrationNumber ?? undefined,
- incorporationCountry: company.incorporationCountry ?? undefined,
incorporationCountryIso: company.incorporationCountryIso ?? undefined,
incorporationSubdivisionIso: company.incorporationSubdivisionIso ?? undefined,
incorporationDate: company.incorporationDate
diff --git a/src/components/companies/company-list.tsx b/src/components/companies/company-list.tsx
index 5d5d95a..d222223 100644
--- a/src/components/companies/company-list.tsx
+++ b/src/components/companies/company-list.tsx
@@ -145,7 +145,6 @@ export function CompanyList() {
legalName: editCompany.legalName,
taxId: editCompany.taxId,
registrationNumber: editCompany.registrationNumber,
- incorporationCountry: editCompany.incorporationCountry,
incorporationCountryIso: editCompany.incorporationCountryIso,
incorporationSubdivisionIso: editCompany.incorporationSubdivisionIso,
incorporationDate: editCompany.incorporationDate,
diff --git a/src/components/companies/company-tabs.tsx b/src/components/companies/company-tabs.tsx
index ed88099..4e76cde 100644
--- a/src/components/companies/company-tabs.tsx
+++ b/src/components/companies/company-tabs.tsx
@@ -38,7 +38,6 @@ interface CompanyTabsCompany {
legalName: string | null;
taxId: string | null;
registrationNumber: string | null;
- incorporationCountry: string | null;
incorporationCountryIso: string | null;
incorporationSubdivisionIso: string | null;
incorporationDate: string | null;
diff --git a/src/lib/db/migrations/0016_magical_spyke.sql b/src/lib/db/migrations/0016_magical_spyke.sql
new file mode 100644
index 0000000..9492f07
--- /dev/null
+++ b/src/lib/db/migrations/0016_magical_spyke.sql
@@ -0,0 +1,6 @@
+ALTER TABLE "client_addresses" DROP COLUMN "state_province";--> statement-breakpoint
+ALTER TABLE "client_addresses" DROP COLUMN "country";--> statement-breakpoint
+ALTER TABLE "clients" DROP COLUMN "nationality";--> statement-breakpoint
+ALTER TABLE "companies" DROP COLUMN "incorporation_country";--> statement-breakpoint
+ALTER TABLE "company_addresses" DROP COLUMN "state_province";--> statement-breakpoint
+ALTER TABLE "company_addresses" DROP COLUMN "country";
\ No newline at end of file
diff --git a/src/lib/db/migrations/meta/0016_snapshot.json b/src/lib/db/migrations/meta/0016_snapshot.json
new file mode 100644
index 0000000..6fa6806
--- /dev/null
+++ b/src/lib/db/migrations/meta/0016_snapshot.json
@@ -0,0 +1,9849 @@
+{
+ "id": "5b7e8483-45ab-4055-8f79-f7cc6f5a02b9",
+ "prevId": "150aaf79-1b4c-413b-ac04-1660454ee759",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.berth_maintenance_log": {
+ "name": "berth_maintenance_log",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "category": {
+ "name": "category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cost": {
+ "name": "cost",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cost_currency": {
+ "name": "cost_currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'USD'"
+ },
+ "responsible_party": {
+ "name": "responsible_party",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "performed_date": {
+ "name": "performed_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "photo_file_ids": {
+ "name": "photo_file_ids",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_bml_berth": {
+ "name": "idx_bml_berth",
+ "columns": [
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_bml_port": {
+ "name": "idx_bml_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "berth_maintenance_log_berth_id_berths_id_fk": {
+ "name": "berth_maintenance_log_berth_id_berths_id_fk",
+ "tableFrom": "berth_maintenance_log",
+ "tableTo": "berths",
+ "columnsFrom": ["berth_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "berth_maintenance_log_port_id_ports_id_fk": {
+ "name": "berth_maintenance_log_port_id_ports_id_fk",
+ "tableFrom": "berth_maintenance_log",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.berth_map_data": {
+ "name": "berth_map_data",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "svg_path": {
+ "name": "svg_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "x": {
+ "name": "x",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "y": {
+ "name": "y",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "transform": {
+ "name": "transform",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "font_size": {
+ "name": "font_size",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "extra_data": {
+ "name": "extra_data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "berth_map_data_berth_id_idx": {
+ "name": "berth_map_data_berth_id_idx",
+ "columns": [
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "berth_map_data_berth_id_berths_id_fk": {
+ "name": "berth_map_data_berth_id_berths_id_fk",
+ "tableFrom": "berth_map_data",
+ "tableTo": "berths",
+ "columnsFrom": ["berth_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "berth_map_data_berth_id_unique": {
+ "name": "berth_map_data_berth_id_unique",
+ "nullsNotDistinct": false,
+ "columns": ["berth_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.berth_recommendations": {
+ "name": "berth_recommendations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "interest_id": {
+ "name": "interest_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "match_score": {
+ "name": "match_score",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "match_reasons": {
+ "name": "match_reasons",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'ai'"
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "berth_rec_interest_berth_idx": {
+ "name": "berth_rec_interest_berth_idx",
+ "columns": [
+ {
+ "expression": "interest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_br_interest": {
+ "name": "idx_br_interest",
+ "columns": [
+ {
+ "expression": "interest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "berth_recommendations_berth_id_berths_id_fk": {
+ "name": "berth_recommendations_berth_id_berths_id_fk",
+ "tableFrom": "berth_recommendations",
+ "tableTo": "berths",
+ "columnsFrom": ["berth_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.berth_tags": {
+ "name": "berth_tags",
+ "schema": "",
+ "columns": {
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tag_id": {
+ "name": "tag_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "berth_tags_berth_id_berths_id_fk": {
+ "name": "berth_tags_berth_id_berths_id_fk",
+ "tableFrom": "berth_tags",
+ "tableTo": "berths",
+ "columnsFrom": ["berth_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "berth_tags_berth_id_tag_id_pk": {
+ "name": "berth_tags_berth_id_tag_id_pk",
+ "columns": ["berth_id", "tag_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.berth_waiting_list": {
+ "name": "berth_waiting_list",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "position": {
+ "name": "position",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "priority": {
+ "name": "priority",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'normal'"
+ },
+ "notify_pref": {
+ "name": "notify_pref",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'email'"
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "berth_waiting_list_berth_client_idx": {
+ "name": "berth_waiting_list_berth_client_idx",
+ "columns": [
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_bwl_berth": {
+ "name": "idx_bwl_berth",
+ "columns": [
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "position",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "berth_waiting_list_berth_id_berths_id_fk": {
+ "name": "berth_waiting_list_berth_id_berths_id_fk",
+ "tableFrom": "berth_waiting_list",
+ "tableTo": "berths",
+ "columnsFrom": ["berth_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "berth_waiting_list_client_id_clients_id_fk": {
+ "name": "berth_waiting_list_client_id_clients_id_fk",
+ "tableFrom": "berth_waiting_list",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.berths": {
+ "name": "berths",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mooring_number": {
+ "name": "mooring_number",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "area": {
+ "name": "area",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'available'"
+ },
+ "length_ft": {
+ "name": "length_ft",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "width_ft": {
+ "name": "width_ft",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "draft_ft": {
+ "name": "draft_ft",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "length_m": {
+ "name": "length_m",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "width_m": {
+ "name": "width_m",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "draft_m": {
+ "name": "draft_m",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "width_is_minimum": {
+ "name": "width_is_minimum",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "nominal_boat_size": {
+ "name": "nominal_boat_size",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "nominal_boat_size_m": {
+ "name": "nominal_boat_size_m",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "water_depth": {
+ "name": "water_depth",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "water_depth_m": {
+ "name": "water_depth_m",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "water_depth_is_minimum": {
+ "name": "water_depth_is_minimum",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "side_pontoon": {
+ "name": "side_pontoon",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "power_capacity": {
+ "name": "power_capacity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "voltage": {
+ "name": "voltage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mooring_type": {
+ "name": "mooring_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cleat_type": {
+ "name": "cleat_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cleat_capacity": {
+ "name": "cleat_capacity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bollard_type": {
+ "name": "bollard_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bollard_capacity": {
+ "name": "bollard_capacity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access": {
+ "name": "access",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "price": {
+ "name": "price",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "price_currency": {
+ "name": "price_currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'USD'"
+ },
+ "bow_facing": {
+ "name": "bow_facing",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "berth_approved": {
+ "name": "berth_approved",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "tenure_type": {
+ "name": "tenure_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'permanent'"
+ },
+ "tenure_years": {
+ "name": "tenure_years",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "tenure_start_date": {
+ "name": "tenure_start_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "tenure_end_date": {
+ "name": "tenure_end_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status_last_changed_by": {
+ "name": "status_last_changed_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status_last_changed_reason": {
+ "name": "status_last_changed_reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status_last_modified": {
+ "name": "status_last_modified",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_berths_port": {
+ "name": "idx_berths_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_berths_status": {
+ "name": "idx_berths_status",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_berths_area": {
+ "name": "idx_berths_area",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "area",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_berths_mooring": {
+ "name": "idx_berths_mooring",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "mooring_number",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "berths_port_id_ports_id_fk": {
+ "name": "berths_port_id_ports_id_fk",
+ "tableFrom": "berths",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.client_addresses": {
+ "name": "client_addresses",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "label": {
+ "name": "label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'Primary'"
+ },
+ "street_address": {
+ "name": "street_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city": {
+ "name": "city",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subdivision_iso": {
+ "name": "subdivision_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "postal_code": {
+ "name": "postal_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_iso": {
+ "name": "country_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_primary": {
+ "name": "is_primary",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_ca_client": {
+ "name": "idx_ca_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ca_port": {
+ "name": "idx_ca_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ca_primary": {
+ "name": "idx_ca_primary",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"client_addresses\".\"is_primary\" = true",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "client_addresses_client_id_clients_id_fk": {
+ "name": "client_addresses_client_id_clients_id_fk",
+ "tableFrom": "client_addresses",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "client_addresses_port_id_ports_id_fk": {
+ "name": "client_addresses_port_id_ports_id_fk",
+ "tableFrom": "client_addresses",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.client_contacts": {
+ "name": "client_contacts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "channel": {
+ "name": "channel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value_e164": {
+ "name": "value_e164",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "value_country": {
+ "name": "value_country",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "label": {
+ "name": "label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_primary": {
+ "name": "is_primary",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_cc_client": {
+ "name": "idx_cc_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_cc_email": {
+ "name": "idx_cc_email",
+ "columns": [
+ {
+ "expression": "channel",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "value",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"client_contacts\".\"channel\" = 'email'",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_cc_phone": {
+ "name": "idx_cc_phone",
+ "columns": [
+ {
+ "expression": "channel",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "value",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"client_contacts\".\"channel\" = 'phone'",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "client_contacts_client_id_clients_id_fk": {
+ "name": "client_contacts_client_id_clients_id_fk",
+ "tableFrom": "client_contacts",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.client_merge_log": {
+ "name": "client_merge_log",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "surviving_client_id": {
+ "name": "surviving_client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "merged_client_id": {
+ "name": "merged_client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "merged_by": {
+ "name": "merged_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "merge_details": {
+ "name": "merge_details",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_cml_port": {
+ "name": "idx_cml_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "client_merge_log_port_id_ports_id_fk": {
+ "name": "client_merge_log_port_id_ports_id_fk",
+ "tableFrom": "client_merge_log",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "client_merge_log_surviving_client_id_clients_id_fk": {
+ "name": "client_merge_log_surviving_client_id_clients_id_fk",
+ "tableFrom": "client_merge_log",
+ "tableTo": "clients",
+ "columnsFrom": ["surviving_client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.client_notes": {
+ "name": "client_notes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "author_id": {
+ "name": "author_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentions": {
+ "name": "mentions",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_locked": {
+ "name": "is_locked",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_cn_client": {
+ "name": "idx_cn_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "client_notes_client_id_clients_id_fk": {
+ "name": "client_notes_client_id_clients_id_fk",
+ "tableFrom": "client_notes",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.client_relationships": {
+ "name": "client_relationships",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_a_id": {
+ "name": "client_a_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_b_id": {
+ "name": "client_b_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "relationship_type": {
+ "name": "relationship_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_cr_port": {
+ "name": "idx_cr_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "client_relationships_port_id_ports_id_fk": {
+ "name": "client_relationships_port_id_ports_id_fk",
+ "tableFrom": "client_relationships",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "client_relationships_client_a_id_clients_id_fk": {
+ "name": "client_relationships_client_a_id_clients_id_fk",
+ "tableFrom": "client_relationships",
+ "tableTo": "clients",
+ "columnsFrom": ["client_a_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "client_relationships_client_b_id_clients_id_fk": {
+ "name": "client_relationships_client_b_id_clients_id_fk",
+ "tableFrom": "client_relationships",
+ "tableTo": "clients",
+ "columnsFrom": ["client_b_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.client_tags": {
+ "name": "client_tags",
+ "schema": "",
+ "columns": {
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tag_id": {
+ "name": "tag_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "client_tags_client_id_clients_id_fk": {
+ "name": "client_tags_client_id_clients_id_fk",
+ "tableFrom": "client_tags",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "client_tags_client_id_tag_id_pk": {
+ "name": "client_tags_client_id_tag_id_pk",
+ "columns": ["client_id", "tag_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.clients": {
+ "name": "clients",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "full_name": {
+ "name": "full_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "nationality_iso": {
+ "name": "nationality_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "preferred_contact_method": {
+ "name": "preferred_contact_method",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "preferred_language": {
+ "name": "preferred_language",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "timezone": {
+ "name": "timezone",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source_details": {
+ "name": "source_details",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_clients_port": {
+ "name": "idx_clients_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_clients_name": {
+ "name": "idx_clients_name",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "full_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_clients_archived": {
+ "name": "idx_clients_archived",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "archived_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_clients_nationality_iso": {
+ "name": "idx_clients_nationality_iso",
+ "columns": [
+ {
+ "expression": "nationality_iso",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "clients_port_id_ports_id_fk": {
+ "name": "clients_port_id_ports_id_fk",
+ "tableFrom": "clients",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.companies": {
+ "name": "companies",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "legal_name": {
+ "name": "legal_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "tax_id": {
+ "name": "tax_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "registration_number": {
+ "name": "registration_number",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "incorporation_country_iso": {
+ "name": "incorporation_country_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "incorporation_subdivision_iso": {
+ "name": "incorporation_subdivision_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "incorporation_date": {
+ "name": "incorporation_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'active'"
+ },
+ "billing_email": {
+ "name": "billing_email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_companies_port": {
+ "name": "idx_companies_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_companies_name_unique": {
+ "name": "idx_companies_name_unique",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "lower(\"name\")",
+ "asc": true,
+ "isExpression": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_companies_taxid": {
+ "name": "idx_companies_taxid",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "tax_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"companies\".\"tax_id\" IS NOT NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "companies_port_id_ports_id_fk": {
+ "name": "companies_port_id_ports_id_fk",
+ "tableFrom": "companies",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.company_addresses": {
+ "name": "company_addresses",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "company_id": {
+ "name": "company_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "label": {
+ "name": "label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'Primary'"
+ },
+ "street_address": {
+ "name": "street_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city": {
+ "name": "city",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subdivision_iso": {
+ "name": "subdivision_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "postal_code": {
+ "name": "postal_code",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_iso": {
+ "name": "country_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_primary": {
+ "name": "is_primary",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_compa_company": {
+ "name": "idx_compa_company",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_compa_port": {
+ "name": "idx_compa_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_compa_primary": {
+ "name": "idx_compa_primary",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"company_addresses\".\"is_primary\" = true",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "company_addresses_company_id_companies_id_fk": {
+ "name": "company_addresses_company_id_companies_id_fk",
+ "tableFrom": "company_addresses",
+ "tableTo": "companies",
+ "columnsFrom": ["company_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "company_addresses_port_id_ports_id_fk": {
+ "name": "company_addresses_port_id_ports_id_fk",
+ "tableFrom": "company_addresses",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.company_memberships": {
+ "name": "company_memberships",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "company_id": {
+ "name": "company_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role_detail": {
+ "name": "role_detail",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_primary": {
+ "name": "is_primary",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_cm_company": {
+ "name": "idx_cm_company",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_cm_client": {
+ "name": "idx_cm_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_cm_active": {
+ "name": "idx_cm_active",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"company_memberships\".\"end_date\" IS NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "unique_cm_exact": {
+ "name": "unique_cm_exact",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "role",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "start_date",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "company_memberships_company_id_companies_id_fk": {
+ "name": "company_memberships_company_id_companies_id_fk",
+ "tableFrom": "company_memberships",
+ "tableTo": "companies",
+ "columnsFrom": ["company_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "company_memberships_client_id_clients_id_fk": {
+ "name": "company_memberships_client_id_clients_id_fk",
+ "tableFrom": "company_memberships",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.company_notes": {
+ "name": "company_notes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "company_id": {
+ "name": "company_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "author_id": {
+ "name": "author_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentions": {
+ "name": "mentions",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_locked": {
+ "name": "is_locked",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_compn_company": {
+ "name": "idx_compn_company",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "company_notes_company_id_companies_id_fk": {
+ "name": "company_notes_company_id_companies_id_fk",
+ "tableFrom": "company_notes",
+ "tableTo": "companies",
+ "columnsFrom": ["company_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.company_tags": {
+ "name": "company_tags",
+ "schema": "",
+ "columns": {
+ "company_id": {
+ "name": "company_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tag_id": {
+ "name": "tag_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "company_tags_company_id_companies_id_fk": {
+ "name": "company_tags_company_id_companies_id_fk",
+ "tableFrom": "company_tags",
+ "tableTo": "companies",
+ "columnsFrom": ["company_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "company_tags_company_id_tag_id_pk": {
+ "name": "company_tags_company_id_tag_id_pk",
+ "columns": ["company_id", "tag_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.crm_user_invites": {
+ "name": "crm_user_invites",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token_hash": {
+ "name": "token_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_super_admin": {
+ "name": "is_super_admin",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "used_at": {
+ "name": "used_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_crm_invites_token_hash": {
+ "name": "idx_crm_invites_token_hash",
+ "columns": [
+ {
+ "expression": "token_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_crm_invites_email": {
+ "name": "idx_crm_invites_email",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.document_events": {
+ "name": "document_events",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "document_id": {
+ "name": "document_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_type": {
+ "name": "event_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "signer_id": {
+ "name": "signer_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "event_data": {
+ "name": "event_data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "signature_hash": {
+ "name": "signature_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_de_doc": {
+ "name": "idx_de_doc",
+ "columns": [
+ {
+ "expression": "document_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_de_dedup": {
+ "name": "idx_de_dedup",
+ "columns": [
+ {
+ "expression": "document_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "signature_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"document_events\".\"signature_hash\" IS NOT NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "document_events_document_id_documents_id_fk": {
+ "name": "document_events_document_id_documents_id_fk",
+ "tableFrom": "document_events",
+ "tableTo": "documents",
+ "columnsFrom": ["document_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "document_events_signer_id_document_signers_id_fk": {
+ "name": "document_events_signer_id_document_signers_id_fk",
+ "tableFrom": "document_events",
+ "tableTo": "document_signers",
+ "columnsFrom": ["signer_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.document_signers": {
+ "name": "document_signers",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "document_id": {
+ "name": "document_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "signer_name": {
+ "name": "signer_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "signer_email": {
+ "name": "signer_email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "signer_role": {
+ "name": "signer_role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "signing_order": {
+ "name": "signing_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "signed_at": {
+ "name": "signed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "signing_url": {
+ "name": "signing_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "embedded_url": {
+ "name": "embedded_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_ds_doc": {
+ "name": "idx_ds_doc",
+ "columns": [
+ {
+ "expression": "document_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "document_signers_document_id_documents_id_fk": {
+ "name": "document_signers_document_id_documents_id_fk",
+ "tableFrom": "document_signers",
+ "tableTo": "documents",
+ "columnsFrom": ["document_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.document_templates": {
+ "name": "document_templates",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "template_type": {
+ "name": "template_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "body_html": {
+ "name": "body_html",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "merge_fields": {
+ "name": "merge_fields",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "template_format": {
+ "name": "template_format",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'html'"
+ },
+ "source_file_id": {
+ "name": "source_file_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "documenso_template_id": {
+ "name": "documenso_template_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "field_mapping": {
+ "name": "field_mapping",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "overlay_positions": {
+ "name": "overlay_positions",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "reminder_cadence_days": {
+ "name": "reminder_cadence_days",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_dt_port": {
+ "name": "idx_dt_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_dt_type": {
+ "name": "idx_dt_type",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "template_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "document_templates_port_id_ports_id_fk": {
+ "name": "document_templates_port_id_ports_id_fk",
+ "tableFrom": "document_templates",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "document_templates_source_file_id_files_id_fk": {
+ "name": "document_templates_source_file_id_files_id_fk",
+ "tableFrom": "document_templates",
+ "tableTo": "files",
+ "columnsFrom": ["source_file_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.document_watchers": {
+ "name": "document_watchers",
+ "schema": "",
+ "columns": {
+ "document_id": {
+ "name": "document_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "added_by": {
+ "name": "added_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "added_at": {
+ "name": "added_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_doc_watchers_doc": {
+ "name": "idx_doc_watchers_doc",
+ "columns": [
+ {
+ "expression": "document_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_doc_watchers_user": {
+ "name": "idx_doc_watchers_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "document_watchers_document_id_documents_id_fk": {
+ "name": "document_watchers_document_id_documents_id_fk",
+ "tableFrom": "document_watchers",
+ "tableTo": "documents",
+ "columnsFrom": ["document_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "document_watchers_document_id_user_id_pk": {
+ "name": "document_watchers_document_id_user_id_pk",
+ "columns": ["document_id", "user_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.documents": {
+ "name": "documents",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "interest_id": {
+ "name": "interest_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "company_id": {
+ "name": "company_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reservation_id": {
+ "name": "reservation_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "document_type": {
+ "name": "document_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'draft'"
+ },
+ "documenso_id": {
+ "name": "documenso_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "file_id": {
+ "name": "file_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "signed_file_id": {
+ "name": "signed_file_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_manual_upload": {
+ "name": "is_manual_upload",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reminders_disabled": {
+ "name": "reminders_disabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "reminder_cadence_override": {
+ "name": "reminder_cadence_override",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_docs_port": {
+ "name": "idx_docs_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_docs_interest": {
+ "name": "idx_docs_interest",
+ "columns": [
+ {
+ "expression": "interest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_docs_client": {
+ "name": "idx_docs_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_documents_yacht": {
+ "name": "idx_documents_yacht",
+ "columns": [
+ {
+ "expression": "yacht_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_documents_company": {
+ "name": "idx_documents_company",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_docs_reservation": {
+ "name": "idx_docs_reservation",
+ "columns": [
+ {
+ "expression": "reservation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_docs_type": {
+ "name": "idx_docs_type",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "document_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_docs_status_port": {
+ "name": "idx_docs_status_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "documents_port_id_ports_id_fk": {
+ "name": "documents_port_id_ports_id_fk",
+ "tableFrom": "documents",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "documents_client_id_clients_id_fk": {
+ "name": "documents_client_id_clients_id_fk",
+ "tableFrom": "documents",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "documents_file_id_files_id_fk": {
+ "name": "documents_file_id_files_id_fk",
+ "tableFrom": "documents",
+ "tableTo": "files",
+ "columnsFrom": ["file_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "documents_signed_file_id_files_id_fk": {
+ "name": "documents_signed_file_id_files_id_fk",
+ "tableFrom": "documents",
+ "tableTo": "files",
+ "columnsFrom": ["signed_file_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.files": {
+ "name": "files",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "company_id": {
+ "name": "company_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "filename": {
+ "name": "filename",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "original_name": {
+ "name": "original_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mime_type": {
+ "name": "mime_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "size_bytes": {
+ "name": "size_bytes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "storage_path": {
+ "name": "storage_path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "storage_bucket": {
+ "name": "storage_bucket",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'crm-files'"
+ },
+ "category": {
+ "name": "category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "uploaded_by": {
+ "name": "uploaded_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_files_port": {
+ "name": "idx_files_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_files_client": {
+ "name": "idx_files_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_files_yacht": {
+ "name": "idx_files_yacht",
+ "columns": [
+ {
+ "expression": "yacht_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_files_company": {
+ "name": "idx_files_company",
+ "columns": [
+ {
+ "expression": "company_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "files_port_id_ports_id_fk": {
+ "name": "files_port_id_ports_id_fk",
+ "tableFrom": "files",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "files_client_id_clients_id_fk": {
+ "name": "files_client_id_clients_id_fk",
+ "tableFrom": "files",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.form_submissions": {
+ "name": "form_submissions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "form_template_id": {
+ "name": "form_template_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "interest_id": {
+ "name": "interest_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "prefilled_data": {
+ "name": "prefilled_data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "submitted_data": {
+ "name": "submitted_data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "submitted_at": {
+ "name": "submitted_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_fs_token": {
+ "name": "idx_fs_token",
+ "columns": [
+ {
+ "expression": "token",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "form_submissions_form_template_id_form_templates_id_fk": {
+ "name": "form_submissions_form_template_id_form_templates_id_fk",
+ "tableFrom": "form_submissions",
+ "tableTo": "form_templates",
+ "columnsFrom": ["form_template_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "form_submissions_client_id_clients_id_fk": {
+ "name": "form_submissions_client_id_clients_id_fk",
+ "tableFrom": "form_submissions",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "form_submissions_token_unique": {
+ "name": "form_submissions_token_unique",
+ "nullsNotDistinct": false,
+ "columns": ["token"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.form_templates": {
+ "name": "form_templates",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "fields": {
+ "name": "fields",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "branding": {
+ "name": "branding",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_ft_port": {
+ "name": "idx_ft_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "form_templates_port_id_ports_id_fk": {
+ "name": "form_templates_port_id_ports_id_fk",
+ "tableFrom": "form_templates",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_accounts": {
+ "name": "email_accounts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email_address": {
+ "name": "email_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "smtp_host": {
+ "name": "smtp_host",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "smtp_port": {
+ "name": "smtp_port",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "imap_host": {
+ "name": "imap_host",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "imap_port": {
+ "name": "imap_port",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "credentials_enc": {
+ "name": "credentials_enc",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "last_sync_at": {
+ "name": "last_sync_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_ea_user": {
+ "name": "idx_ea_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_ea_port": {
+ "name": "idx_ea_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "email_accounts_port_id_ports_id_fk": {
+ "name": "email_accounts_port_id_ports_id_fk",
+ "tableFrom": "email_accounts",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_messages": {
+ "name": "email_messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "thread_id": {
+ "name": "thread_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message_id_header": {
+ "name": "message_id_header",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "from_address": {
+ "name": "from_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "to_addresses": {
+ "name": "to_addresses",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cc_addresses": {
+ "name": "cc_addresses",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subject": {
+ "name": "subject",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "body_text": {
+ "name": "body_text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "body_html": {
+ "name": "body_html",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "direction": {
+ "name": "direction",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sent_at": {
+ "name": "sent_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "attachment_file_ids": {
+ "name": "attachment_file_ids",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "raw_file_id": {
+ "name": "raw_file_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_em_thread": {
+ "name": "idx_em_thread",
+ "columns": [
+ {
+ "expression": "thread_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_em_message_id": {
+ "name": "idx_em_message_id",
+ "columns": [
+ {
+ "expression": "message_id_header",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"email_messages\".\"message_id_header\" IS NOT NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "email_messages_thread_id_email_threads_id_fk": {
+ "name": "email_messages_thread_id_email_threads_id_fk",
+ "tableFrom": "email_messages",
+ "tableTo": "email_threads",
+ "columnsFrom": ["thread_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "email_messages_raw_file_id_files_id_fk": {
+ "name": "email_messages_raw_file_id_files_id_fk",
+ "tableFrom": "email_messages",
+ "tableTo": "files",
+ "columnsFrom": ["raw_file_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_threads": {
+ "name": "email_threads",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subject": {
+ "name": "subject",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_message_at": {
+ "name": "last_message_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "message_count": {
+ "name": "message_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_et_client": {
+ "name": "idx_et_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_et_port": {
+ "name": "idx_et_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "email_threads_port_id_ports_id_fk": {
+ "name": "email_threads_port_id_ports_id_fk",
+ "tableFrom": "email_threads",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "email_threads_client_id_clients_id_fk": {
+ "name": "email_threads_client_id_clients_id_fk",
+ "tableFrom": "email_threads",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.expenses": {
+ "name": "expenses",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "establishment_name": {
+ "name": "establishment_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "amount": {
+ "name": "amount",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "currency": {
+ "name": "currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'USD'"
+ },
+ "amount_usd": {
+ "name": "amount_usd",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "exchange_rate": {
+ "name": "exchange_rate",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payment_method": {
+ "name": "payment_method",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "category": {
+ "name": "category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payer": {
+ "name": "payer",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expense_date": {
+ "name": "expense_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "receipt_file_ids": {
+ "name": "receipt_file_ids",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payment_status": {
+ "name": "payment_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'unpaid'"
+ },
+ "payment_date": {
+ "name": "payment_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payment_reference": {
+ "name": "payment_reference",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payment_notes": {
+ "name": "payment_notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "duplicate_of": {
+ "name": "duplicate_of",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dedup_scanned_at": {
+ "name": "dedup_scanned_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ocr_status": {
+ "name": "ocr_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'pending'"
+ },
+ "ocr_raw": {
+ "name": "ocr_raw",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ocr_confidence": {
+ "name": "ocr_confidence",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_expenses_port": {
+ "name": "idx_expenses_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_expenses_date": {
+ "name": "idx_expenses_date",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "expense_date",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_expenses_category": {
+ "name": "idx_expenses_category",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "category",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_expenses_dedup": {
+ "name": "idx_expenses_dedup",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "establishment_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "amount",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "expense_date",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "duplicate_of IS NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "expenses_port_id_ports_id_fk": {
+ "name": "expenses_port_id_ports_id_fk",
+ "tableFrom": "expenses",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "expenses_duplicate_of_expenses_id_fk": {
+ "name": "expenses_duplicate_of_expenses_id_fk",
+ "tableFrom": "expenses",
+ "tableTo": "expenses",
+ "columnsFrom": ["duplicate_of"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.invoice_expenses": {
+ "name": "invoice_expenses",
+ "schema": "",
+ "columns": {
+ "invoice_id": {
+ "name": "invoice_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expense_id": {
+ "name": "expense_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "invoice_expenses_invoice_id_invoices_id_fk": {
+ "name": "invoice_expenses_invoice_id_invoices_id_fk",
+ "tableFrom": "invoice_expenses",
+ "tableTo": "invoices",
+ "columnsFrom": ["invoice_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "invoice_expenses_expense_id_expenses_id_fk": {
+ "name": "invoice_expenses_expense_id_expenses_id_fk",
+ "tableFrom": "invoice_expenses",
+ "tableTo": "expenses",
+ "columnsFrom": ["expense_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "invoice_expenses_invoice_id_expense_id_pk": {
+ "name": "invoice_expenses_invoice_id_expense_id_pk",
+ "columns": ["invoice_id", "expense_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.invoice_line_items": {
+ "name": "invoice_line_items",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "invoice_id": {
+ "name": "invoice_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "quantity": {
+ "name": "quantity",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'1'"
+ },
+ "unit_price": {
+ "name": "unit_price",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "total": {
+ "name": "total",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_ili_invoice": {
+ "name": "idx_ili_invoice",
+ "columns": [
+ {
+ "expression": "invoice_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "invoice_line_items_invoice_id_invoices_id_fk": {
+ "name": "invoice_line_items_invoice_id_invoices_id_fk",
+ "tableFrom": "invoice_line_items",
+ "tableTo": "invoices",
+ "columnsFrom": ["invoice_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.invoices": {
+ "name": "invoices",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "invoice_number": {
+ "name": "invoice_number",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_name": {
+ "name": "client_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "billing_entity_type": {
+ "name": "billing_entity_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'client'"
+ },
+ "billing_entity_id": {
+ "name": "billing_entity_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "billing_email": {
+ "name": "billing_email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "billing_address": {
+ "name": "billing_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "due_date": {
+ "name": "due_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "payment_terms": {
+ "name": "payment_terms",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'net30'"
+ },
+ "currency": {
+ "name": "currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'USD'"
+ },
+ "subtotal": {
+ "name": "subtotal",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "discount_pct": {
+ "name": "discount_pct",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'0'"
+ },
+ "discount_amount": {
+ "name": "discount_amount",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'0'"
+ },
+ "fee_pct": {
+ "name": "fee_pct",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'0'"
+ },
+ "fee_amount": {
+ "name": "fee_amount",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'0'"
+ },
+ "total": {
+ "name": "total",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'draft'"
+ },
+ "payment_status": {
+ "name": "payment_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'unpaid'"
+ },
+ "payment_date": {
+ "name": "payment_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payment_method": {
+ "name": "payment_method",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payment_reference": {
+ "name": "payment_reference",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pdf_file_id": {
+ "name": "pdf_file_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_invoices_number": {
+ "name": "idx_invoices_number",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "invoice_number",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_invoices_port": {
+ "name": "idx_invoices_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_invoices_status": {
+ "name": "idx_invoices_status",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_invoices_billing_entity": {
+ "name": "idx_invoices_billing_entity",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "billing_entity_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "billing_entity_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "invoices_port_id_ports_id_fk": {
+ "name": "invoices_port_id_ports_id_fk",
+ "tableFrom": "invoices",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "invoices_pdf_file_id_files_id_fk": {
+ "name": "invoices_pdf_file_id_files_id_fk",
+ "tableFrom": "invoices",
+ "tableTo": "files",
+ "columnsFrom": ["pdf_file_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.ports": {
+ "name": "ports",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slug": {
+ "name": "slug",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "logo_url": {
+ "name": "logo_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "primary_color": {
+ "name": "primary_color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "default_currency": {
+ "name": "default_currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'USD'"
+ },
+ "timezone": {
+ "name": "timezone",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'America/Anguilla'"
+ },
+ "settings": {
+ "name": "settings",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "ports_slug_idx": {
+ "name": "ports_slug_idx",
+ "columns": [
+ {
+ "expression": "slug",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.account": {
+ "name": "account",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "account_id": {
+ "name": "account_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider_id": {
+ "name": "provider_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "id_token": {
+ "name": "id_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_token_expires_at": {
+ "name": "access_token_expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token_expires_at": {
+ "name": "refresh_token_expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scope": {
+ "name": "scope",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "account_user_id_user_id_fk": {
+ "name": "account_user_id_user_id_fk",
+ "tableFrom": "account",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.port_role_overrides": {
+ "name": "port_role_overrides",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role_id": {
+ "name": "role_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permission_overrides": {
+ "name": "permission_overrides",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "port_role_overrides_port_role_idx": {
+ "name": "port_role_overrides_port_role_idx",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "role_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "port_role_overrides_port_idx": {
+ "name": "port_role_overrides_port_idx",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "port_role_overrides_port_id_ports_id_fk": {
+ "name": "port_role_overrides_port_id_ports_id_fk",
+ "tableFrom": "port_role_overrides",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "port_role_overrides_role_id_roles_id_fk": {
+ "name": "port_role_overrides_role_id_roles_id_fk",
+ "tableFrom": "port_role_overrides",
+ "tableTo": "roles",
+ "columnsFrom": ["role_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.roles": {
+ "name": "roles",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "permissions": {
+ "name": "permissions",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "is_global": {
+ "name": "is_global",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "is_system": {
+ "name": "is_system",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.session": {
+ "name": "session",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ip_address": {
+ "name": "ip_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "sessions_token_idx": {
+ "name": "sessions_token_idx",
+ "columns": [
+ {
+ "expression": "token",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "sessions_user_id_idx": {
+ "name": "sessions_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "session_token_unique": {
+ "name": "session_token_unique",
+ "nullsNotDistinct": false,
+ "columns": ["token"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email_verified": {
+ "name": "email_verified",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_email_unique": {
+ "name": "user_email_unique",
+ "nullsNotDistinct": false,
+ "columns": ["email"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_port_roles": {
+ "name": "user_port_roles",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role_id": {
+ "name": "role_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "residential_access": {
+ "name": "residential_access",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "assigned_by": {
+ "name": "assigned_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "user_port_roles_user_port_role_idx": {
+ "name": "user_port_roles_user_port_role_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "role_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_upr_user": {
+ "name": "idx_upr_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_upr_port": {
+ "name": "idx_upr_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_port_roles_port_id_ports_id_fk": {
+ "name": "user_port_roles_port_id_ports_id_fk",
+ "tableFrom": "user_port_roles",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_port_roles_role_id_roles_id_fk": {
+ "name": "user_port_roles_role_id_roles_id_fk",
+ "tableFrom": "user_port_roles",
+ "tableTo": "roles",
+ "columnsFrom": ["role_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_profiles": {
+ "name": "user_profiles",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "display_name": {
+ "name": "display_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "avatar_url": {
+ "name": "avatar_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone": {
+ "name": "phone",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_super_admin": {
+ "name": "is_super_admin",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "last_login_at": {
+ "name": "last_login_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "preferences": {
+ "name": "preferences",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "user_profiles_user_id_idx": {
+ "name": "user_profiles_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_profiles_user_id_unique": {
+ "name": "user_profiles_user_id_unique",
+ "nullsNotDistinct": false,
+ "columns": ["user_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.verification": {
+ "name": "verification",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "identifier": {
+ "name": "identifier",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.yacht_notes": {
+ "name": "yacht_notes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "author_id": {
+ "name": "author_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentions": {
+ "name": "mentions",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_locked": {
+ "name": "is_locked",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_yn_yacht": {
+ "name": "idx_yn_yacht",
+ "columns": [
+ {
+ "expression": "yacht_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "yacht_notes_yacht_id_yachts_id_fk": {
+ "name": "yacht_notes_yacht_id_yachts_id_fk",
+ "tableFrom": "yacht_notes",
+ "tableTo": "yachts",
+ "columnsFrom": ["yacht_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.yacht_ownership_history": {
+ "name": "yacht_ownership_history",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "owner_type": {
+ "name": "owner_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "owner_id": {
+ "name": "owner_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "transfer_reason": {
+ "name": "transfer_reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "transfer_notes": {
+ "name": "transfer_notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_yoh_yacht": {
+ "name": "idx_yoh_yacht",
+ "columns": [
+ {
+ "expression": "yacht_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_yoh_active": {
+ "name": "idx_yoh_active",
+ "columns": [
+ {
+ "expression": "yacht_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"yacht_ownership_history\".\"end_date\" IS NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "yacht_ownership_history_yacht_id_yachts_id_fk": {
+ "name": "yacht_ownership_history_yacht_id_yachts_id_fk",
+ "tableFrom": "yacht_ownership_history",
+ "tableTo": "yachts",
+ "columnsFrom": ["yacht_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.yacht_tags": {
+ "name": "yacht_tags",
+ "schema": "",
+ "columns": {
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tag_id": {
+ "name": "tag_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "yacht_tags_yacht_id_yachts_id_fk": {
+ "name": "yacht_tags_yacht_id_yachts_id_fk",
+ "tableFrom": "yacht_tags",
+ "tableTo": "yachts",
+ "columnsFrom": ["yacht_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "yacht_tags_yacht_id_tag_id_pk": {
+ "name": "yacht_tags_yacht_id_tag_id_pk",
+ "columns": ["yacht_id", "tag_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.yachts": {
+ "name": "yachts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hull_number": {
+ "name": "hull_number",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "registration": {
+ "name": "registration",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "flag": {
+ "name": "flag",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "year_built": {
+ "name": "year_built",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "builder": {
+ "name": "builder",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "hull_material": {
+ "name": "hull_material",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "length_ft": {
+ "name": "length_ft",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "width_ft": {
+ "name": "width_ft",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "draft_ft": {
+ "name": "draft_ft",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "length_m": {
+ "name": "length_m",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "width_m": {
+ "name": "width_m",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "draft_m": {
+ "name": "draft_m",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "current_owner_type": {
+ "name": "current_owner_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "current_owner_id": {
+ "name": "current_owner_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'active'"
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_yachts_port": {
+ "name": "idx_yachts_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_yachts_current_owner": {
+ "name": "idx_yachts_current_owner",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "current_owner_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "current_owner_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_yachts_name": {
+ "name": "idx_yachts_name",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_yachts_archived": {
+ "name": "idx_yachts_archived",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "archived_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "yachts_port_id_ports_id_fk": {
+ "name": "yachts_port_id_ports_id_fk",
+ "tableFrom": "yachts",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.interest_notes": {
+ "name": "interest_notes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "interest_id": {
+ "name": "interest_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "author_id": {
+ "name": "author_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentions": {
+ "name": "mentions",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_locked": {
+ "name": "is_locked",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_in_interest": {
+ "name": "idx_in_interest",
+ "columns": [
+ {
+ "expression": "interest_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "interest_notes_interest_id_interests_id_fk": {
+ "name": "interest_notes_interest_id_interests_id_fk",
+ "tableFrom": "interest_notes",
+ "tableTo": "interests",
+ "columnsFrom": ["interest_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.interest_tags": {
+ "name": "interest_tags",
+ "schema": "",
+ "columns": {
+ "interest_id": {
+ "name": "interest_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tag_id": {
+ "name": "tag_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "interest_tags_interest_id_interests_id_fk": {
+ "name": "interest_tags_interest_id_interests_id_fk",
+ "tableFrom": "interest_tags",
+ "tableTo": "interests",
+ "columnsFrom": ["interest_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "interest_tags_interest_id_tag_id_pk": {
+ "name": "interest_tags_interest_id_tag_id_pk",
+ "columns": ["interest_id", "tag_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.interests": {
+ "name": "interests",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pipeline_stage": {
+ "name": "pipeline_stage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'open'"
+ },
+ "lead_category": {
+ "name": "lead_category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "eoi_status": {
+ "name": "eoi_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "documenso_id": {
+ "name": "documenso_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "contract_status": {
+ "name": "contract_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "deposit_status": {
+ "name": "deposit_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reservation_status": {
+ "name": "reservation_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_first_contact": {
+ "name": "date_first_contact",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_last_contact": {
+ "name": "date_last_contact",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_eoi_sent": {
+ "name": "date_eoi_sent",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_eoi_signed": {
+ "name": "date_eoi_signed",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_contract_sent": {
+ "name": "date_contract_sent",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_contract_signed": {
+ "name": "date_contract_signed",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_deposit_received": {
+ "name": "date_deposit_received",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reminder_enabled": {
+ "name": "reminder_enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "reminder_days": {
+ "name": "reminder_days",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reminder_last_fired": {
+ "name": "reminder_last_fired",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_interests_port": {
+ "name": "idx_interests_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_interests_client": {
+ "name": "idx_interests_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_interests_berth": {
+ "name": "idx_interests_berth",
+ "columns": [
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_interests_yacht": {
+ "name": "idx_interests_yacht",
+ "columns": [
+ {
+ "expression": "yacht_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_interests_stage": {
+ "name": "idx_interests_stage",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "pipeline_stage",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_interests_archived": {
+ "name": "idx_interests_archived",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "archived_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "interests_port_id_ports_id_fk": {
+ "name": "interests_port_id_ports_id_fk",
+ "tableFrom": "interests",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "interests_client_id_clients_id_fk": {
+ "name": "interests_client_id_clients_id_fk",
+ "tableFrom": "interests",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.berth_reservations": {
+ "name": "berth_reservations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "yacht_id": {
+ "name": "yacht_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "interest_id": {
+ "name": "interest_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "tenure_type": {
+ "name": "tenure_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'permanent'"
+ },
+ "contract_file_id": {
+ "name": "contract_file_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_br_berth": {
+ "name": "idx_br_berth",
+ "columns": [
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_br_client": {
+ "name": "idx_br_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_br_yacht": {
+ "name": "idx_br_yacht",
+ "columns": [
+ {
+ "expression": "yacht_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_br_port": {
+ "name": "idx_br_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_br_active": {
+ "name": "idx_br_active",
+ "columns": [
+ {
+ "expression": "berth_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"berth_reservations\".\"status\" = 'active'",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "berth_reservations_berth_id_berths_id_fk": {
+ "name": "berth_reservations_berth_id_berths_id_fk",
+ "tableFrom": "berth_reservations",
+ "tableTo": "berths",
+ "columnsFrom": ["berth_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "berth_reservations_port_id_ports_id_fk": {
+ "name": "berth_reservations_port_id_ports_id_fk",
+ "tableFrom": "berth_reservations",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "berth_reservations_client_id_clients_id_fk": {
+ "name": "berth_reservations_client_id_clients_id_fk",
+ "tableFrom": "berth_reservations",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "berth_reservations_yacht_id_yachts_id_fk": {
+ "name": "berth_reservations_yacht_id_yachts_id_fk",
+ "tableFrom": "berth_reservations",
+ "tableTo": "yachts",
+ "columnsFrom": ["yacht_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "berth_reservations_interest_id_interests_id_fk": {
+ "name": "berth_reservations_interest_id_interests_id_fk",
+ "tableFrom": "berth_reservations",
+ "tableTo": "interests",
+ "columnsFrom": ["interest_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "berth_reservations_contract_file_id_files_id_fk": {
+ "name": "berth_reservations_contract_file_id_files_id_fk",
+ "tableFrom": "berth_reservations",
+ "tableTo": "files",
+ "columnsFrom": ["contract_file_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.portal_auth_tokens": {
+ "name": "portal_auth_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "portal_user_id": {
+ "name": "portal_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token_hash": {
+ "name": "token_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "used_at": {
+ "name": "used_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_portal_tokens_hash_unique": {
+ "name": "idx_portal_tokens_hash_unique",
+ "columns": [
+ {
+ "expression": "token_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_portal_tokens_user": {
+ "name": "idx_portal_tokens_user",
+ "columns": [
+ {
+ "expression": "portal_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "portal_auth_tokens_portal_user_id_portal_users_id_fk": {
+ "name": "portal_auth_tokens_portal_user_id_portal_users_id_fk",
+ "tableFrom": "portal_auth_tokens",
+ "tableTo": "portal_users",
+ "columnsFrom": ["portal_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.portal_users": {
+ "name": "portal_users",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password_hash": {
+ "name": "password_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "last_login_at": {
+ "name": "last_login_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_portal_users_email_unique": {
+ "name": "idx_portal_users_email_unique",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_portal_users_client": {
+ "name": "idx_portal_users_client",
+ "columns": [
+ {
+ "expression": "client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_portal_users_port": {
+ "name": "idx_portal_users_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "portal_users_port_id_ports_id_fk": {
+ "name": "portal_users_port_id_ports_id_fk",
+ "tableFrom": "portal_users",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "portal_users_client_id_clients_id_fk": {
+ "name": "portal_users_client_id_clients_id_fk",
+ "tableFrom": "portal_users",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.residential_clients": {
+ "name": "residential_clients",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "full_name": {
+ "name": "full_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone": {
+ "name": "phone",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_e164": {
+ "name": "phone_e164",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_country": {
+ "name": "phone_country",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "nationality_iso": {
+ "name": "nationality_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "timezone": {
+ "name": "timezone",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "place_of_residence": {
+ "name": "place_of_residence",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "place_of_residence_country_iso": {
+ "name": "place_of_residence_country_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subdivision_iso": {
+ "name": "subdivision_iso",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "preferred_contact_method": {
+ "name": "preferred_contact_method",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'prospect'"
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_residential_clients_port": {
+ "name": "idx_residential_clients_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_residential_clients_email": {
+ "name": "idx_residential_clients_email",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_residential_clients_archived": {
+ "name": "idx_residential_clients_archived",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "archived_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "residential_clients_port_id_ports_id_fk": {
+ "name": "residential_clients_port_id_ports_id_fk",
+ "tableFrom": "residential_clients",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.residential_interests": {
+ "name": "residential_interests",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "residential_client_id": {
+ "name": "residential_client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pipeline_stage": {
+ "name": "pipeline_stage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'new'"
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "notes": {
+ "name": "notes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "preferences": {
+ "name": "preferences",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "assigned_to": {
+ "name": "assigned_to",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_first_contact": {
+ "name": "date_first_contact",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "date_last_contact": {
+ "name": "date_last_contact",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "archived_at": {
+ "name": "archived_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_residential_interests_port": {
+ "name": "idx_residential_interests_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_residential_interests_client": {
+ "name": "idx_residential_interests_client",
+ "columns": [
+ {
+ "expression": "residential_client_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_residential_interests_stage": {
+ "name": "idx_residential_interests_stage",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "pipeline_stage",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_residential_interests_assigned": {
+ "name": "idx_residential_interests_assigned",
+ "columns": [
+ {
+ "expression": "assigned_to",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_residential_interests_archived": {
+ "name": "idx_residential_interests_archived",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "archived_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "residential_interests_port_id_ports_id_fk": {
+ "name": "residential_interests_port_id_ports_id_fk",
+ "tableFrom": "residential_interests",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "residential_interests_residential_client_id_residential_clients_id_fk": {
+ "name": "residential_interests_residential_client_id_residential_clients_id_fk",
+ "tableFrom": "residential_interests",
+ "tableTo": "residential_clients",
+ "columnsFrom": ["residential_client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.generated_reports": {
+ "name": "generated_reports",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "scheduled_report_id": {
+ "name": "scheduled_report_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "report_type": {
+ "name": "report_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'queued'"
+ },
+ "parameters": {
+ "name": "parameters",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "file_id": {
+ "name": "file_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error_message": {
+ "name": "error_message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "requested_by": {
+ "name": "requested_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "started_at": {
+ "name": "started_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "completed_at": {
+ "name": "completed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_gr_port_created": {
+ "name": "idx_gr_port_created",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_gr_port_status": {
+ "name": "idx_gr_port_status",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_gr_scheduled": {
+ "name": "idx_gr_scheduled",
+ "columns": [
+ {
+ "expression": "scheduled_report_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"generated_reports\".\"scheduled_report_id\" IS NOT NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "generated_reports_port_id_ports_id_fk": {
+ "name": "generated_reports_port_id_ports_id_fk",
+ "tableFrom": "generated_reports",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "generated_reports_scheduled_report_id_scheduled_reports_id_fk": {
+ "name": "generated_reports_scheduled_report_id_scheduled_reports_id_fk",
+ "tableFrom": "generated_reports",
+ "tableTo": "scheduled_reports",
+ "columnsFrom": ["scheduled_report_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "generated_reports_file_id_files_id_fk": {
+ "name": "generated_reports_file_id_files_id_fk",
+ "tableFrom": "generated_reports",
+ "tableTo": "files",
+ "columnsFrom": ["file_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.google_calendar_cache": {
+ "name": "google_calendar_cache",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_id": {
+ "name": "event_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_at": {
+ "name": "start_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_at": {
+ "name": "end_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "location": {
+ "name": "location",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_crm_pushed": {
+ "name": "is_crm_pushed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "reminder_id": {
+ "name": "reminder_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "fetched_at": {
+ "name": "fetched_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "gcal_cache_user_event_idx": {
+ "name": "gcal_cache_user_event_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "event_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_gcal_cache_user": {
+ "name": "idx_gcal_cache_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "start_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "google_calendar_cache_reminder_id_reminders_id_fk": {
+ "name": "google_calendar_cache_reminder_id_reminders_id_fk",
+ "tableFrom": "google_calendar_cache",
+ "tableTo": "reminders",
+ "columnsFrom": ["reminder_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.google_calendar_tokens": {
+ "name": "google_calendar_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token_expiry": {
+ "name": "token_expiry",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "calendar_id": {
+ "name": "calendar_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'primary'"
+ },
+ "connected_at": {
+ "name": "connected_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "last_sync_at": {
+ "name": "last_sync_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sync_enabled": {
+ "name": "sync_enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "gcal_tokens_user_id_idx": {
+ "name": "gcal_tokens_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "google_calendar_tokens_user_id_unique": {
+ "name": "google_calendar_tokens_user_id_unique",
+ "nullsNotDistinct": false,
+ "columns": ["user_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.notifications": {
+ "name": "notifications",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "link": {
+ "name": "link",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "entity_type": {
+ "name": "entity_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "entity_id": {
+ "name": "entity_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_read": {
+ "name": "is_read",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "email_sent": {
+ "name": "email_sent",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_notif_user": {
+ "name": "idx_notif_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "is_read",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_notif_port": {
+ "name": "idx_notif_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_notifications_user_type": {
+ "name": "idx_notifications_user_type",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "notifications_port_id_ports_id_fk": {
+ "name": "notifications_port_id_ports_id_fk",
+ "tableFrom": "notifications",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reminders": {
+ "name": "reminders",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "note": {
+ "name": "note",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "due_at": {
+ "name": "due_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "priority": {
+ "name": "priority",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'medium'"
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "assigned_to": {
+ "name": "assigned_to",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "interest_id": {
+ "name": "interest_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "berth_id": {
+ "name": "berth_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "auto_generated": {
+ "name": "auto_generated",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "google_calendar_event_id": {
+ "name": "google_calendar_event_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "google_calendar_synced": {
+ "name": "google_calendar_synced",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "snoozed_until": {
+ "name": "snoozed_until",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "completed_at": {
+ "name": "completed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_reminders_port": {
+ "name": "idx_reminders_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_reminders_assigned": {
+ "name": "idx_reminders_assigned",
+ "columns": [
+ {
+ "expression": "assigned_to",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_reminders_due": {
+ "name": "idx_reminders_due",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "due_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"reminders\".\"status\" IN ('pending', 'snoozed')",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "reminders_port_id_ports_id_fk": {
+ "name": "reminders_port_id_ports_id_fk",
+ "tableFrom": "reminders",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "reminders_client_id_clients_id_fk": {
+ "name": "reminders_client_id_clients_id_fk",
+ "tableFrom": "reminders",
+ "tableTo": "clients",
+ "columnsFrom": ["client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.report_recipients": {
+ "name": "report_recipients",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "report_id": {
+ "name": "report_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "report_recipients_report_email_idx": {
+ "name": "report_recipients_report_email_idx",
+ "columns": [
+ {
+ "expression": "report_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_rr_report": {
+ "name": "idx_rr_report",
+ "columns": [
+ {
+ "expression": "report_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "report_recipients_report_id_scheduled_reports_id_fk": {
+ "name": "report_recipients_report_id_scheduled_reports_id_fk",
+ "tableFrom": "report_recipients",
+ "tableTo": "scheduled_reports",
+ "columnsFrom": ["report_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.scheduled_reports": {
+ "name": "scheduled_reports",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "report_type": {
+ "name": "report_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "schedule": {
+ "name": "schedule",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_run_at": {
+ "name": "last_run_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "next_run_at": {
+ "name": "next_run_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "config": {
+ "name": "config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_sr_port": {
+ "name": "idx_sr_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "scheduled_reports_port_id_ports_id_fk": {
+ "name": "scheduled_reports_port_id_ports_id_fk",
+ "tableFrom": "scheduled_reports",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.audit_logs": {
+ "name": "audit_logs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "action": {
+ "name": "action",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "entity_type": {
+ "name": "entity_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "entity_id": {
+ "name": "entity_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "field_changed": {
+ "name": "field_changed",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "old_value": {
+ "name": "old_value",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "new_value": {
+ "name": "new_value",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ip_address": {
+ "name": "ip_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reverted_by": {
+ "name": "reverted_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "reverted_at": {
+ "name": "reverted_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "revert_of": {
+ "name": "revert_of",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ },
+ "search_text": {
+ "name": "search_text",
+ "type": "tsvector",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_al_port": {
+ "name": "idx_al_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_al_entity": {
+ "name": "idx_al_entity",
+ "columns": [
+ {
+ "expression": "entity_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "entity_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_al_user": {
+ "name": "idx_al_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_al_created": {
+ "name": "idx_al_created",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "audit_logs_port_id_ports_id_fk": {
+ "name": "audit_logs_port_id_ports_id_fk",
+ "tableFrom": "audit_logs",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "audit_logs_revert_of_audit_logs_id_fk": {
+ "name": "audit_logs_revert_of_audit_logs_id_fk",
+ "tableFrom": "audit_logs",
+ "tableTo": "audit_logs",
+ "columnsFrom": ["revert_of"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.currency_rates": {
+ "name": "currency_rates",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "base_currency": {
+ "name": "base_currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "target_currency": {
+ "name": "target_currency",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rate": {
+ "name": "rate",
+ "type": "numeric",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'frankfurter'"
+ },
+ "fetched_at": {
+ "name": "fetched_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "currency_rates_base_target_idx": {
+ "name": "currency_rates_base_target_idx",
+ "columns": [
+ {
+ "expression": "base_currency",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "target_currency",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.custom_field_definitions": {
+ "name": "custom_field_definitions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "entity_type": {
+ "name": "entity_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "field_name": {
+ "name": "field_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "field_label": {
+ "name": "field_label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "field_type": {
+ "name": "field_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "select_options": {
+ "name": "select_options",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_required": {
+ "name": "is_required",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "cfd_port_entity_name_idx": {
+ "name": "cfd_port_entity_name_idx",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "entity_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "field_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_cfd_port": {
+ "name": "idx_cfd_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "custom_field_definitions_port_id_ports_id_fk": {
+ "name": "custom_field_definitions_port_id_ports_id_fk",
+ "tableFrom": "custom_field_definitions",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.custom_field_values": {
+ "name": "custom_field_values",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "field_id": {
+ "name": "field_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "entity_id": {
+ "name": "entity_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "cfv_field_entity_idx": {
+ "name": "cfv_field_entity_idx",
+ "columns": [
+ {
+ "expression": "field_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "entity_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_cfv_entity": {
+ "name": "idx_cfv_entity",
+ "columns": [
+ {
+ "expression": "entity_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "custom_field_values_field_id_custom_field_definitions_id_fk": {
+ "name": "custom_field_values_field_id_custom_field_definitions_id_fk",
+ "tableFrom": "custom_field_values",
+ "tableTo": "custom_field_definitions",
+ "columnsFrom": ["field_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.saved_views": {
+ "name": "saved_views",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "entity_type": {
+ "name": "entity_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "filters": {
+ "name": "filters",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sort_config": {
+ "name": "sort_config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "column_config": {
+ "name": "column_config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_shared": {
+ "name": "is_shared",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "is_default": {
+ "name": "is_default",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_sv_user": {
+ "name": "idx_sv_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "entity_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "saved_views_port_id_ports_id_fk": {
+ "name": "saved_views_port_id_ports_id_fk",
+ "tableFrom": "saved_views",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.scratchpad_notes": {
+ "name": "scratchpad_notes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "linked_client_id": {
+ "name": "linked_client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linked_at": {
+ "name": "linked_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_sp_user": {
+ "name": "idx_sp_user",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "scratchpad_notes_linked_client_id_clients_id_fk": {
+ "name": "scratchpad_notes_linked_client_id_clients_id_fk",
+ "tableFrom": "scratchpad_notes",
+ "tableTo": "clients",
+ "columnsFrom": ["linked_client_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.system_settings": {
+ "name": "system_settings",
+ "schema": "",
+ "columns": {
+ "key": {
+ "name": "key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updated_by": {
+ "name": "updated_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "system_settings_key_port_idx": {
+ "name": "system_settings_key_port_idx",
+ "columns": [
+ {
+ "expression": "key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "system_settings_port_id_ports_id_fk": {
+ "name": "system_settings_port_id_ports_id_fk",
+ "tableFrom": "system_settings",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.tags": {
+ "name": "tags",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "color": {
+ "name": "color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'#6B7280'"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "tags_port_name_idx": {
+ "name": "tags_port_name_idx",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_tags_port": {
+ "name": "idx_tags_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "tags_port_id_ports_id_fk": {
+ "name": "tags_port_id_ports_id_fk",
+ "tableFrom": "tags",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_notification_preferences": {
+ "name": "user_notification_preferences",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "notification_type": {
+ "name": "notification_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "in_app": {
+ "name": "in_app",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "email": {
+ "name": "email",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ }
+ },
+ "indexes": {
+ "unp_user_port_type_idx": {
+ "name": "unp_user_port_type_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "notification_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_notification_preferences_port_id_ports_id_fk": {
+ "name": "user_notification_preferences_port_id_ports_id_fk",
+ "tableFrom": "user_notification_preferences",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.webhook_deliveries": {
+ "name": "webhook_deliveries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhook_id": {
+ "name": "webhook_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_type": {
+ "name": "event_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "response_status": {
+ "name": "response_status",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "response_body": {
+ "name": "response_body",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "attempt": {
+ "name": "attempt",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "delivered_at": {
+ "name": "delivered_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_wd_webhook": {
+ "name": "idx_wd_webhook",
+ "columns": [
+ {
+ "expression": "webhook_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "webhook_deliveries_webhook_id_webhooks_id_fk": {
+ "name": "webhook_deliveries_webhook_id_webhooks_id_fk",
+ "tableFrom": "webhook_deliveries",
+ "tableTo": "webhooks",
+ "columnsFrom": ["webhook_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.webhooks": {
+ "name": "webhooks",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "url": {
+ "name": "url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "events": {
+ "name": "events",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_by": {
+ "name": "created_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "idx_webhooks_port": {
+ "name": "idx_webhooks_port",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "webhooks_port_id_ports_id_fk": {
+ "name": "webhooks_port_id_ports_id_fk",
+ "tableFrom": "webhooks",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.alerts": {
+ "name": "alerts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rule_id": {
+ "name": "rule_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "severity": {
+ "name": "severity",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "body": {
+ "name": "body",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "link": {
+ "name": "link",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "entity_type": {
+ "name": "entity_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "entity_id": {
+ "name": "entity_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "fingerprint": {
+ "name": "fingerprint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "fired_at": {
+ "name": "fired_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "dismissed_at": {
+ "name": "dismissed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dismissed_by": {
+ "name": "dismissed_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "acknowledged_at": {
+ "name": "acknowledged_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "acknowledged_by": {
+ "name": "acknowledged_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resolved_at": {
+ "name": "resolved_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{}'::jsonb"
+ }
+ },
+ "indexes": {
+ "idx_alerts_fingerprint_open": {
+ "name": "idx_alerts_fingerprint_open",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "fingerprint",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "resolved_at IS NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_alerts_port_fired": {
+ "name": "idx_alerts_port_fired",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "fired_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "idx_alerts_port_severity_open": {
+ "name": "idx_alerts_port_severity_open",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "severity",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "resolved_at IS NULL AND dismissed_at IS NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "alerts_port_id_ports_id_fk": {
+ "name": "alerts_port_id_ports_id_fk",
+ "tableFrom": "alerts",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "alerts_dismissed_by_user_id_fk": {
+ "name": "alerts_dismissed_by_user_id_fk",
+ "tableFrom": "alerts",
+ "tableTo": "user",
+ "columnsFrom": ["dismissed_by"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "alerts_acknowledged_by_user_id_fk": {
+ "name": "alerts_acknowledged_by_user_id_fk",
+ "tableFrom": "alerts",
+ "tableTo": "user",
+ "columnsFrom": ["acknowledged_by"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.analytics_snapshots": {
+ "name": "analytics_snapshots",
+ "schema": "",
+ "columns": {
+ "port_id": {
+ "name": "port_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "metric_id": {
+ "name": "metric_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "computed_at": {
+ "name": "computed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "data": {
+ "name": "data",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "idx_analytics_pk": {
+ "name": "idx_analytics_pk",
+ "columns": [
+ {
+ "expression": "port_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "metric_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "analytics_snapshots_port_id_ports_id_fk": {
+ "name": "analytics_snapshots_port_id_ports_id_fk",
+ "tableFrom": "analytics_snapshots",
+ "tableTo": "ports",
+ "columnsFrom": ["port_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
diff --git a/src/lib/db/migrations/meta/_journal.json b/src/lib/db/migrations/meta/_journal.json
index 93e5f79..3e0f67a 100644
--- a/src/lib/db/migrations/meta/_journal.json
+++ b/src/lib/db/migrations/meta/_journal.json
@@ -113,6 +113,13 @@
"when": 1777391373291,
"tag": "0015_i18n_columns",
"breakpoints": true
+ },
+ {
+ "idx": 16,
+ "version": "7",
+ "when": 1777395538988,
+ "tag": "0016_magical_spyke",
+ "breakpoints": true
}
]
}
diff --git a/src/lib/db/schema/clients.ts b/src/lib/db/schema/clients.ts
index ba31145..4fd50b0 100644
--- a/src/lib/db/schema/clients.ts
+++ b/src/lib/db/schema/clients.ts
@@ -21,9 +21,7 @@ export const clients = pgTable(
.notNull()
.references(() => ports.id),
fullName: text('full_name').notNull(),
- nationality: text('nationality'),
- /** ISO-3166-1 alpha-2 nationality code. Supersedes `nationality`
- * after the i18n backfill (PR10) drops the legacy column. */
+ /** ISO-3166-1 alpha-2 nationality code. */
nationalityIso: text('nationality_iso'),
preferredContactMethod: text('preferred_contact_method'), // email, phone, whatsapp
preferredLanguage: text('preferred_language'),
@@ -162,12 +160,10 @@ export const clientAddresses = pgTable(
label: text('label').notNull().default('Primary'),
streetAddress: text('street_address'),
city: text('city'),
- stateProvince: text('state_province'),
/** ISO 3166-2 subdivision code (e.g. 'PL-MZ', 'US-CA'). Optional. */
subdivisionIso: text('subdivision_iso'),
postalCode: text('postal_code'),
- country: text('country'),
- /** ISO-3166-1 alpha-2 country code. Supersedes `country` after backfill. */
+ /** ISO-3166-1 alpha-2 country code. */
countryIso: text('country_iso'),
isPrimary: boolean('is_primary').notNull().default(true),
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
diff --git a/src/lib/db/schema/companies.ts b/src/lib/db/schema/companies.ts
index 9f409b3..be3de4b 100644
--- a/src/lib/db/schema/companies.ts
+++ b/src/lib/db/schema/companies.ts
@@ -24,9 +24,7 @@ export const companies = pgTable(
legalName: text('legal_name'),
taxId: text('tax_id'),
registrationNumber: text('registration_number'),
- incorporationCountry: text('incorporation_country'),
- /** ISO-3166-1 alpha-2 country of incorporation. Replaces the
- * free-text `incorporation_country` after the i18n backfill. */
+ /** ISO-3166-1 alpha-2 country of incorporation. */
incorporationCountryIso: text('incorporation_country_iso'),
/** ISO 3166-2 subdivision (state/province) of incorporation. Optional. */
incorporationSubdivisionIso: text('incorporation_subdivision_iso'),
@@ -93,12 +91,10 @@ export const companyAddresses = pgTable(
label: text('label').notNull().default('Primary'),
streetAddress: text('street_address'),
city: text('city'),
- stateProvince: text('state_province'),
/** ISO 3166-2 subdivision code. Optional. */
subdivisionIso: text('subdivision_iso'),
postalCode: text('postal_code'),
- country: text('country'),
- /** ISO-3166-1 alpha-2 country code. Supersedes `country` after backfill. */
+ /** ISO-3166-1 alpha-2 country code. */
countryIso: text('country_iso'),
isPrimary: boolean('is_primary').notNull().default(true),
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
diff --git a/src/lib/db/seed-data.ts b/src/lib/db/seed-data.ts
index f12ba9f..4d1078b 100644
--- a/src/lib/db/seed-data.ts
+++ b/src/lib/db/seed-data.ts
@@ -230,7 +230,7 @@ export async function seedPortData(portId: string, portSlug: string): Promise = [
{
fullName: 'Helena Marsh',
- nationality: 'British',
+ nationalityIso: 'GB',
email: 'helena.marsh@example.com',
phone: '+44 20 7946 0001',
whatsapp: '+44 7700 900001',
city: 'London',
- country: 'United Kingdom',
+ countryIso: 'GB',
postalCode: 'SW1A 1AA',
street: '22 Belgrave Square',
},
{
fullName: 'Marcus Laurent',
- nationality: 'French',
+ nationalityIso: 'FR',
email: 'marcus.laurent@example.com',
phone: '+33 4 93 00 0002',
city: 'Nice',
- country: 'France',
+ countryIso: 'FR',
postalCode: '06300',
street: '8 Promenade des Anglais',
},
{
fullName: 'Sofia Reyes',
- nationality: 'Spanish',
+ nationalityIso: 'ES',
email: 'sofia.reyes@example.com',
phone: '+34 971 000 003',
whatsapp: '+34 666 000 003',
city: 'Palma',
- country: 'Spain',
+ countryIso: 'ES',
postalCode: '07012',
street: 'Passeig Marítim 12',
},
{
fullName: 'Dimitrios Andreadis',
- nationality: 'Greek',
+ nationalityIso: 'GR',
email: 'd.andreadis@aegean-holdings.example',
phone: '+30 210 000 0004',
city: 'Athens',
- country: 'Greece',
+ countryIso: 'GR',
postalCode: '10558',
street: '14 Mikonou Avenue',
},
{
fullName: 'Katerina Papadakis',
- nationality: 'Greek',
+ nationalityIso: 'GR',
email: 'k.papadakis@aegean-holdings.example',
phone: '+30 210 000 0005',
whatsapp: '+30 694 000 0005',
city: 'Athens',
- country: 'Greece',
+ countryIso: 'GR',
postalCode: '10558',
street: '14 Mikonou Avenue',
},
{
fullName: 'Jonas Lindqvist',
- nationality: 'Swedish',
+ nationalityIso: 'SE',
email: 'jonas.lindqvist@example.com',
phone: '+46 8 000 0006',
city: 'Stockholm',
- country: 'Sweden',
+ countryIso: 'SE',
postalCode: '11129',
street: 'Strandvägen 47',
},
{
fullName: 'Isabella Conti',
- nationality: 'Italian',
+ nationalityIso: 'IT',
email: 'isabella.conti@example.com',
phone: '+39 010 000 0007',
whatsapp: '+39 333 000 0007',
city: 'Genoa',
- country: 'Italy',
+ countryIso: 'IT',
postalCode: '16124',
street: 'Via Garibaldi 9',
},
{
fullName: 'Raymond Osei',
- nationality: 'Ghanaian',
+ nationalityIso: 'GH',
email: 'raymond.osei@example.com',
phone: '+233 30 000 0008',
city: 'Accra',
- country: 'Ghana',
+ countryIso: 'GH',
postalCode: 'GA-183-1090',
street: '21 Independence Ave',
},
@@ -414,7 +414,7 @@ export async function seedPortData(portId: string, portSlug: string): Promise ({
portId,
fullName: c.fullName,
- nationality: c.nationality,
+ nationalityIso: c.nationalityIso,
preferredContactMethod: 'email' as const,
preferredLanguage: 'en',
source: 'referral' as const,
@@ -462,9 +462,9 @@ export async function seedPortData(portId: string, portSlug: string): Promise 0) {
const clientsWithTags = await db
diff --git a/src/lib/services/companies.service.ts b/src/lib/services/companies.service.ts
index d2ec681..083909c 100644
--- a/src/lib/services/companies.service.ts
+++ b/src/lib/services/companies.service.ts
@@ -64,7 +64,8 @@ export async function createCompany(portId: string, data: CreateCompanyInput, me
legalName: data.legalName ?? null,
taxId: data.taxId ?? null,
registrationNumber: data.registrationNumber ?? null,
- incorporationCountry: data.incorporationCountry ?? null,
+ incorporationCountryIso: data.incorporationCountryIso ?? null,
+ incorporationSubdivisionIso: data.incorporationSubdivisionIso ?? null,
incorporationDate: data.incorporationDate ?? null,
status: data.status ?? 'active',
billingEmail: data.billingEmail ?? null,
diff --git a/src/lib/services/document-templates.ts b/src/lib/services/document-templates.ts
index 2e81e91..3b18a9a 100644
--- a/src/lib/services/document-templates.ts
+++ b/src/lib/services/document-templates.ts
@@ -17,6 +17,7 @@ import { minioClient, buildStoragePath } from '@/lib/minio';
import { env } from '@/lib/env';
import { logger } from '@/lib/logger';
import { generatePdf } from '@/lib/pdf/generate';
+import { getCountryName } from '@/lib/i18n/countries';
import {
createDocument as documensoCreate,
sendDocument as documensoSend,
@@ -344,7 +345,9 @@ export async function resolveTemplate(
tokenMap['{{client.fullName}}'] = client.fullName ?? '';
tokenMap['{{client.email}}'] = emailContact?.value ?? '';
tokenMap['{{client.phone}}'] = phoneContact?.value ?? '';
- tokenMap['{{client.nationality}}'] = client.nationality ?? '';
+ tokenMap['{{client.nationality}}'] = client.nationalityIso
+ ? getCountryName(client.nationalityIso, 'en')
+ : '';
}
}
}
diff --git a/src/lib/services/eoi-context.ts b/src/lib/services/eoi-context.ts
index 650c977..48a596d 100644
--- a/src/lib/services/eoi-context.ts
+++ b/src/lib/services/eoi-context.ts
@@ -7,6 +7,7 @@ import { companies, companyAddresses } from '@/lib/db/schema/companies';
import { interests } from '@/lib/db/schema/interests';
import { ports } from '@/lib/db/schema/ports';
import { yachts } from '@/lib/db/schema/yachts';
+import { getCountryName } from '@/lib/i18n/countries';
import { NotFoundError, ValidationError } from '@/lib/errors';
// ─── Types ────────────────────────────────────────────────────────────────────
@@ -136,12 +137,13 @@ export async function buildEoiContext(interestId: string, portId: string): Promi
contactRows.find((c) => c.channel === 'phone') ??
contactRows.find((c) => c.channel === 'whatsapp');
- // 6. Primary address.
+ // 6. Primary address. Country is rendered as the localized name (English by
+ // default for documents) from the ISO code.
const [primaryAddress] = await db
.select({
streetAddress: clientAddresses.streetAddress,
city: clientAddresses.city,
- country: clientAddresses.country,
+ countryIso: clientAddresses.countryIso,
})
.from(clientAddresses)
.where(and(eq(clientAddresses.clientId, client.id), eq(clientAddresses.isPrimary, true)))
@@ -151,7 +153,7 @@ export async function buildEoiContext(interestId: string, portId: string): Promi
? {
street: primaryAddress.streetAddress ?? '',
city: primaryAddress.city ?? '',
- country: primaryAddress.country ?? '',
+ country: primaryAddress.countryIso ? getCountryName(primaryAddress.countryIso, 'en') : '',
}
: null;
@@ -185,7 +187,7 @@ export async function buildEoiContext(interestId: string, portId: string): Promi
.select({
streetAddress: companyAddresses.streetAddress,
city: companyAddresses.city,
- country: companyAddresses.country,
+ countryIso: companyAddresses.countryIso,
})
.from(companyAddresses)
.where(and(eq(companyAddresses.companyId, company.id), eq(companyAddresses.isPrimary, true)))
@@ -195,7 +197,9 @@ export async function buildEoiContext(interestId: string, portId: string): Promi
? [
companyPrimaryAddress.streetAddress,
companyPrimaryAddress.city,
- companyPrimaryAddress.country,
+ companyPrimaryAddress.countryIso
+ ? getCountryName(companyPrimaryAddress.countryIso, 'en')
+ : null,
]
.filter((s): s is string => Boolean(s))
.join(', ') || null
@@ -219,7 +223,7 @@ export async function buildEoiContext(interestId: string, portId: string): Promi
return {
client: {
fullName: client.fullName,
- nationality: client.nationality,
+ nationality: client.nationalityIso ? getCountryName(client.nationalityIso, 'en') : null,
primaryEmail: firstEmail?.value ?? null,
primaryPhone: firstPhone?.value ?? null,
address: clientAddress,
diff --git a/src/lib/services/invoices.ts b/src/lib/services/invoices.ts
index 7bc2a2e..ddca0ab 100644
--- a/src/lib/services/invoices.ts
+++ b/src/lib/services/invoices.ts
@@ -13,6 +13,8 @@ import { createAuditLog } from '@/lib/audit';
import { diffEntity } from '@/lib/entity-diff';
import { withTransaction } from '@/lib/db/utils';
import { NotFoundError, ConflictError, ValidationError } from '@/lib/errors';
+import { getCountryName } from '@/lib/i18n/countries';
+import { getSubdivisionName } from '@/lib/i18n/subdivisions';
import { emitToRoom } from '@/lib/socket/server';
import { logger } from '@/lib/logger';
import { generatePdf } from '@/lib/pdf/generate';
@@ -99,9 +101,9 @@ async function resolveBillingEntity(
? [
addressRow.streetAddress,
addressRow.city,
- addressRow.stateProvince,
+ addressRow.subdivisionIso ? getSubdivisionName(addressRow.subdivisionIso) : null,
addressRow.postalCode,
- addressRow.country,
+ addressRow.countryIso ? getCountryName(addressRow.countryIso, 'en') : null,
]
.filter(Boolean)
.join(', ')
@@ -126,9 +128,9 @@ async function resolveBillingEntity(
? [
addressRow.streetAddress,
addressRow.city,
- addressRow.stateProvince,
+ addressRow.subdivisionIso ? getSubdivisionName(addressRow.subdivisionIso) : null,
addressRow.postalCode,
- addressRow.country,
+ addressRow.countryIso ? getCountryName(addressRow.countryIso, 'en') : null,
]
.filter(Boolean)
.join(', ')
diff --git a/src/lib/services/portal.service.ts b/src/lib/services/portal.service.ts
index 00cf6f7..1c0acef 100644
--- a/src/lib/services/portal.service.ts
+++ b/src/lib/services/portal.service.ts
@@ -11,6 +11,7 @@ import { yachts } from '@/lib/db/schema/yachts';
import { companies, companyMemberships } from '@/lib/db/schema/companies';
import { berthReservations } from '@/lib/db/schema/reservations';
import { getPresignedUrl } from '@/lib/minio';
+import { getCountryName } from '@/lib/i18n/countries';
// ─── Dashboard ────────────────────────────────────────────────────────────────
@@ -82,7 +83,7 @@ export async function getPortalDashboard(
client: {
id: client.id,
fullName: client.fullName,
- nationality: client.nationality ?? null,
+ nationality: client.nationalityIso ? getCountryName(client.nationalityIso, 'en') : null,
},
port: {
name: port.name,
diff --git a/src/lib/services/reservation-agreement-context.ts b/src/lib/services/reservation-agreement-context.ts
index b6bd611..7841de1 100644
--- a/src/lib/services/reservation-agreement-context.ts
+++ b/src/lib/services/reservation-agreement-context.ts
@@ -6,6 +6,7 @@ import { berthReservations } from '@/lib/db/schema/reservations';
import { clients } from '@/lib/db/schema/clients';
import { ports } from '@/lib/db/schema/ports';
import { yachts } from '@/lib/db/schema/yachts';
+import { getCountryName } from '@/lib/i18n/countries';
import { NotFoundError } from '@/lib/errors';
export type ReservationAgreementContext = {
@@ -100,7 +101,7 @@ export async function buildReservationAgreementContext(
client: {
id: client.id,
fullName: client.fullName,
- nationality: client.nationality,
+ nationality: client.nationalityIso ? getCountryName(client.nationalityIso, 'en') : null,
},
yacht: {
id: yacht.id,
diff --git a/src/lib/validators/clients.ts b/src/lib/validators/clients.ts
index e3845d6..8efbcb6 100644
--- a/src/lib/validators/clients.ts
+++ b/src/lib/validators/clients.ts
@@ -26,8 +26,6 @@ export const contactSchema = z.object({
export const createClientSchema = z.object({
fullName: z.string().min(1).max(200),
contacts: z.array(contactSchema).min(1, 'At least one contact is required'),
- /** Legacy free-text nationality. Kept for backfill only — new edits write `nationalityIso`. */
- nationality: z.string().optional(),
/** ISO-3166-1 alpha-2 nationality code. */
nationalityIso: optionalCountryIsoSchema.optional(),
preferredContactMethod: z.enum(['email', 'phone', 'whatsapp']).optional(),
diff --git a/src/lib/validators/companies.ts b/src/lib/validators/companies.ts
index f7507c9..6b59372 100644
--- a/src/lib/validators/companies.ts
+++ b/src/lib/validators/companies.ts
@@ -7,8 +7,6 @@ export const createCompanySchema = z.object({
legalName: z.string().optional(),
taxId: z.string().optional(),
registrationNumber: z.string().optional(),
- /** Legacy free-text. New writes use `incorporationCountryIso`. */
- incorporationCountry: z.string().optional(),
/** ISO-3166-1 alpha-2 country of incorporation. */
incorporationCountryIso: optionalCountryIsoSchema.optional(),
/** ISO 3166-2 state/province of incorporation. */
diff --git a/src/lib/validators/interests.ts b/src/lib/validators/interests.ts
index d13f772..9a9dd6d 100644
--- a/src/lib/validators/interests.ts
+++ b/src/lib/validators/interests.ts
@@ -74,13 +74,9 @@ export const generateRecommendationsSchema = z.object({
const addressSchema = z.object({
street: z.string().max(500).optional(),
city: z.string().max(200).optional(),
- /** Legacy free-text. New writes use `subdivisionIso`. */
- stateProvince: z.string().max(200).optional(),
/** ISO 3166-2 subdivision code (e.g. 'PL-MZ'). */
subdivisionIso: optionalSubdivisionIsoSchema.optional(),
postalCode: z.string().max(50).optional(),
- /** Legacy free-text. New writes use `countryIso`. */
- country: z.string().max(100).optional(),
/** ISO-3166-1 alpha-2 country code. */
countryIso: optionalCountryIsoSchema.optional(),
});
@@ -105,8 +101,6 @@ const publicCompanySchema = z.object({
name: z.string().min(1).max(200),
legalName: z.string().max(200).optional(),
taxId: z.string().max(100).optional(),
- /** Legacy free-text. New website builds should send `incorporationCountryIso`. */
- incorporationCountry: z.string().max(100).optional(),
/** ISO-3166-1 alpha-2 country of incorporation. */
incorporationCountryIso: optionalCountryIsoSchema.optional(),
/** ISO 3166-2 state/province of incorporation. */
diff --git a/tests/integration/document-templates-eoi.test.ts b/tests/integration/document-templates-eoi.test.ts
index 95bef41..fecb1fe 100644
--- a/tests/integration/document-templates-eoi.test.ts
+++ b/tests/integration/document-templates-eoi.test.ts
@@ -126,7 +126,7 @@ describe('resolveTemplate — EOI scope tokens', () => {
const port = await makePort();
const client = await makeClient({
portId: port.id,
- overrides: { fullName: 'Alice Client', nationality: 'US', source: 'referral' },
+ overrides: { fullName: 'Alice Client', nationalityIso: 'US', source: 'referral' },
});
await db.insert(clientContacts).values([
{ clientId: client.id, channel: 'email', value: 'alice@example.com', isPrimary: true },
@@ -137,7 +137,7 @@ describe('resolveTemplate — EOI scope tokens', () => {
portId: port.id,
streetAddress: '1 Main St',
city: 'Town',
- country: 'US',
+ countryIso: 'US',
isPrimary: true,
});
@@ -321,7 +321,7 @@ describe('resolveTemplate — legacy fallback (no interestId)', () => {
const port = await makePort();
const client = await makeClient({
portId: port.id,
- overrides: { fullName: 'Carol NoInterest', nationality: 'UK', source: 'website' },
+ overrides: { fullName: 'Carol NoInterest', nationalityIso: 'GB', source: 'website' },
});
await db.insert(clientContacts).values({
clientId: client.id,
@@ -349,7 +349,8 @@ describe('resolveTemplate — legacy fallback (no interestId)', () => {
expect(resolved).toContain('Hello Carol NoInterest');
expect(resolved).toContain('carol@example.com');
- expect(resolved).toContain('from UK');
+ // Nationality renders the localized name from the ISO code (GB -> United Kingdom).
+ expect(resolved).toContain('from United Kingdom');
expect(resolved).toContain('src=website');
});
diff --git a/tests/integration/document-templates-generate-and-sign.test.ts b/tests/integration/document-templates-generate-and-sign.test.ts
index 3071042..cd20dbd 100644
--- a/tests/integration/document-templates-generate-and-sign.test.ts
+++ b/tests/integration/document-templates-generate-and-sign.test.ts
@@ -108,7 +108,7 @@ beforeAll(async () => {
const port = await makePort();
const client = await makeClient({
portId: port.id,
- overrides: { fullName: 'Dual Path Client', nationality: 'US' },
+ overrides: { fullName: 'Dual Path Client', nationalityIso: 'US' },
});
await db.insert(clientContacts).values({
clientId: client.id,
@@ -121,7 +121,7 @@ beforeAll(async () => {
portId: port.id,
streetAddress: '1 Wharf Rd',
city: 'Harbor',
- country: 'US',
+ countryIso: 'US',
isPrimary: true,
});
diff --git a/tests/integration/invoices-billing-entity.test.ts b/tests/integration/invoices-billing-entity.test.ts
index e0a45f8..eab2177 100644
--- a/tests/integration/invoices-billing-entity.test.ts
+++ b/tests/integration/invoices-billing-entity.test.ts
@@ -161,9 +161,9 @@ describe('invoices.service — billing entity', () => {
label: 'Primary',
streetAddress: '1 Pier Road',
city: 'Harbor City',
- stateProvince: 'CA',
+ subdivisionIso: 'US-CA',
postalCode: '90000',
- country: 'USA',
+ countryIso: 'US',
isPrimary: true,
});
@@ -180,7 +180,10 @@ describe('invoices.service — billing entity', () => {
);
expect(invoice.billingEmail).toBe('bob@example.com');
- expect(invoice.billingAddress).toBe('1 Pier Road, Harbor City, CA, 90000, USA');
+ // Address is rendered using ISO->name lookup (US-CA -> California, US -> United States).
+ expect(invoice.billingAddress).toBe(
+ '1 Pier Road, Harbor City, California, 90000, United States',
+ );
});
it('allows caller to override billingEmail and billingAddress', async () => {
@@ -196,9 +199,9 @@ describe('invoices.service — billing entity', () => {
label: 'Primary',
streetAddress: '2 Ocean Blvd',
city: 'Portville',
- stateProvince: 'FL',
+ subdivisionIso: 'US-FL',
postalCode: '33101',
- country: 'USA',
+ countryIso: 'US',
isPrimary: true,
});
diff --git a/tests/unit/services/eoi-context.test.ts b/tests/unit/services/eoi-context.test.ts
index a1d1d27..da54487 100644
--- a/tests/unit/services/eoi-context.test.ts
+++ b/tests/unit/services/eoi-context.test.ts
@@ -35,7 +35,7 @@ describe('buildEoiContext', () => {
const port = await makePort();
const client = await makeClient({
portId: port.id,
- overrides: { fullName: 'Alice Test', nationality: 'US' },
+ overrides: { fullName: 'Alice Test', nationalityIso: 'US' },
});
// Insert contacts.
@@ -60,7 +60,7 @@ describe('buildEoiContext', () => {
portId: port.id,
streetAddress: '1 Harbour Way',
city: 'Anguilla',
- country: 'AI',
+ countryIso: 'AI',
isPrimary: true,
});
@@ -94,15 +94,16 @@ describe('buildEoiContext', () => {
const ctx = await buildEoiContext(interest.id, port.id);
- // Client assertions.
+ // Client assertions. Nationality + address country are rendered as
+ // localized names (Intl.DisplayNames) from the ISO codes.
expect(ctx.client.fullName).toBe('Alice Test');
- expect(ctx.client.nationality).toBe('US');
+ expect(ctx.client.nationality).toBe('United States');
expect(ctx.client.primaryEmail).toBe('alice@example.com');
expect(ctx.client.primaryPhone).toBe('+1-555-1234');
expect(ctx.client.address).toEqual({
street: '1 Harbour Way',
city: 'Anguilla',
- country: 'AI',
+ country: 'Anguilla',
});
// Yacht assertions.
@@ -181,7 +182,7 @@ describe('buildEoiContext', () => {
portId: port.id,
streetAddress: '99 Commerce St',
city: 'Valley',
- country: 'AI',
+ countryIso: 'AI',
isPrimary: true,
});
@@ -206,7 +207,8 @@ describe('buildEoiContext', () => {
expect(ctx.company!.billingAddress).not.toBeNull();
expect(ctx.company!.billingAddress).toContain('99 Commerce St');
expect(ctx.company!.billingAddress).toContain('Valley');
- expect(ctx.company!.billingAddress).toContain('AI');
+ // Country is rendered as the localized name (AI -> Anguilla).
+ expect(ctx.company!.billingAddress).toContain('Anguilla');
});
it('throws ValidationError when interest has no yacht', async () => {