snapshot of https://github.com/marmelab/atomic-crm.git (main, 2026-09-18; blobs > 131072B omitted)
Some checks failed
✅ Check / 🔬 ESLint (push) Failing after 21s
✅ Check / 🏷️ Typecheck (push) Failing after 11s
✅ Check / 🔎 Test (push) Failing after 11s
✅ Check / e2e-test (push) Failing after 11s
✅ Check / 🔨 Build (push) Failing after 11s
🚀 Deploy / 🚀 Deploy (doc) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (demo) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (supabase) (push) Failing after 18s
Some checks failed
✅ Check / 🔬 ESLint (push) Failing after 21s
✅ Check / 🏷️ Typecheck (push) Failing after 11s
✅ Check / 🔎 Test (push) Failing after 11s
✅ Check / e2e-test (push) Failing after 11s
✅ Check / 🔨 Build (push) Failing after 11s
🚀 Deploy / 🚀 Deploy (doc) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (demo) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (supabase) (push) Failing after 18s
This commit is contained in:
600
supabase/migrations/20240730075029_init_db.sql
Normal file
600
supabase/migrations/20240730075029_init_db.sql
Normal file
@@ -0,0 +1,600 @@
|
||||
create table "public"."companies" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"created_at" timestamp with time zone not null default now(),
|
||||
"name" text not null,
|
||||
"sector" text,
|
||||
"size" smallint,
|
||||
"linkedin_url" text,
|
||||
"website" text,
|
||||
"phone_number" text,
|
||||
"address" text,
|
||||
"zipcode" text,
|
||||
"city" text,
|
||||
"stateAbbr" text,
|
||||
"sales_id" bigint,
|
||||
"context_links" json,
|
||||
"country" text,
|
||||
"description" text,
|
||||
"revenue" text,
|
||||
"tax_identifier" text,
|
||||
"logo" jsonb
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."companies" enable row level security;
|
||||
|
||||
create table "public"."contactNotes" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"contact_id" bigint not null,
|
||||
"text" text,
|
||||
"date" timestamp with time zone default now(),
|
||||
"sales_id" bigint,
|
||||
"status" text,
|
||||
"attachments" jsonb[]
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."contactNotes" enable row level security;
|
||||
|
||||
create table "public"."contacts" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"first_name" text,
|
||||
"last_name" text,
|
||||
"gender" text,
|
||||
"title" text,
|
||||
"email" text,
|
||||
"phone_1_number" text,
|
||||
"phone_1_type" text,
|
||||
"phone_2_number" text,
|
||||
"phone_2_type" text,
|
||||
"background" text,
|
||||
"acquisition" text,
|
||||
"avatar" jsonb,
|
||||
"first_seen" timestamp with time zone,
|
||||
"last_seen" timestamp with time zone,
|
||||
"has_newsletter" boolean,
|
||||
"status" text,
|
||||
"tags" bigint[],
|
||||
"company_id" bigint,
|
||||
"sales_id" bigint,
|
||||
"linkedin_url" text
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."contacts" enable row level security;
|
||||
|
||||
create table "public"."dealNotes" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"deal_id" bigint not null,
|
||||
"type" text,
|
||||
"text" text,
|
||||
"date" timestamp with time zone default now(),
|
||||
"sales_id" bigint,
|
||||
"attachments" jsonb[]
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."dealNotes" enable row level security;
|
||||
|
||||
create table "public"."deals" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"name" text not null,
|
||||
"company_id" bigint,
|
||||
"contact_ids" bigint[],
|
||||
"category" text,
|
||||
"stage" text not null,
|
||||
"description" text,
|
||||
"amount" bigint,
|
||||
"created_at" timestamp with time zone not null default now(),
|
||||
"updated_at" timestamp with time zone not null default now(),
|
||||
"archived_at" timestamp with time zone default null,
|
||||
"expected_closing_date" timestamp with time zone default null,
|
||||
"sales_id" bigint,
|
||||
"index" smallint
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."deals" enable row level security;
|
||||
|
||||
create table "public"."sales" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"first_name" text not null,
|
||||
"last_name" text not null,
|
||||
"email" text not null,
|
||||
"administrator" boolean not null,
|
||||
"user_id" uuid not null,
|
||||
"avatar" jsonb,
|
||||
"disabled" boolean not null default FALSE
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."sales" enable row level security;
|
||||
|
||||
create table "public"."tags" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"name" text not null,
|
||||
"color" text not null
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."tags" enable row level security;
|
||||
|
||||
create table "public"."tasks" (
|
||||
"id" bigint generated by default as identity not null,
|
||||
"contact_id" bigint not null,
|
||||
"type" text,
|
||||
"text" text,
|
||||
"due_date" timestamp with time zone not null,
|
||||
"done_date" timestamp with time zone
|
||||
);
|
||||
|
||||
|
||||
alter table "public"."tasks" enable row level security;
|
||||
|
||||
CREATE UNIQUE INDEX companies_pkey ON public.companies USING btree (id);
|
||||
|
||||
CREATE UNIQUE INDEX "contactNotes_pkey" ON public."contactNotes" USING btree (id);
|
||||
|
||||
CREATE UNIQUE INDEX contacts_pkey ON public.contacts USING btree (id);
|
||||
|
||||
CREATE UNIQUE INDEX "dealNotes_pkey" ON public."dealNotes" USING btree (id);
|
||||
|
||||
CREATE UNIQUE INDEX deals_pkey ON public.deals USING btree (id);
|
||||
|
||||
CREATE UNIQUE INDEX sales_pkey ON public.sales USING btree (id);
|
||||
|
||||
CREATE UNIQUE INDEX tags_pkey ON public.tags USING btree (id);
|
||||
|
||||
CREATE UNIQUE INDEX tasks_pkey ON public.tasks USING btree (id);
|
||||
|
||||
alter table "public"."companies" add constraint "companies_pkey" PRIMARY KEY using index "companies_pkey";
|
||||
|
||||
alter table "public"."contactNotes" add constraint "contactNotes_pkey" PRIMARY KEY using index "contactNotes_pkey";
|
||||
|
||||
alter table "public"."contacts" add constraint "contacts_pkey" PRIMARY KEY using index "contacts_pkey";
|
||||
|
||||
alter table "public"."dealNotes" add constraint "dealNotes_pkey" PRIMARY KEY using index "dealNotes_pkey";
|
||||
|
||||
alter table "public"."deals" add constraint "deals_pkey" PRIMARY KEY using index "deals_pkey";
|
||||
|
||||
alter table "public"."sales" add constraint "sales_pkey" PRIMARY KEY using index "sales_pkey";
|
||||
|
||||
alter table "public"."tags" add constraint "tags_pkey" PRIMARY KEY using index "tags_pkey";
|
||||
|
||||
alter table "public"."tasks" add constraint "tasks_pkey" PRIMARY KEY using index "tasks_pkey";
|
||||
|
||||
alter table "public"."companies" add constraint "companies_sales_id_fkey" FOREIGN KEY (sales_id) REFERENCES sales(id) not valid;
|
||||
|
||||
alter table "public"."companies" validate constraint "companies_sales_id_fkey";
|
||||
|
||||
alter table "public"."contactNotes" add constraint "contactNotes_contact_id_fkey" FOREIGN KEY (contact_id) REFERENCES contacts(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
|
||||
|
||||
alter table "public"."contactNotes" validate constraint "contactNotes_contact_id_fkey";
|
||||
|
||||
alter table "public"."contactNotes" add constraint "contactNotes_sales_id_fkey" FOREIGN KEY (sales_id) REFERENCES sales(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
|
||||
|
||||
alter table "public"."contactNotes" validate constraint "contactNotes_sales_id_fkey";
|
||||
|
||||
alter table "public"."contacts" add constraint "contacts_company_id_fkey" FOREIGN KEY (company_id) REFERENCES companies(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
|
||||
|
||||
alter table "public"."contacts" validate constraint "contacts_company_id_fkey";
|
||||
|
||||
alter table "public"."contacts" add constraint "contacts_sales_id_fkey" FOREIGN KEY (sales_id) REFERENCES sales(id) not valid;
|
||||
|
||||
alter table "public"."contacts" validate constraint "contacts_sales_id_fkey";
|
||||
|
||||
alter table "public"."dealNotes" add constraint "dealNotes_deal_id_fkey" FOREIGN KEY (deal_id) REFERENCES deals(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
|
||||
|
||||
alter table "public"."dealNotes" validate constraint "dealNotes_deal_id_fkey";
|
||||
|
||||
alter table "public"."dealNotes" add constraint "dealNotes_sales_id_fkey" FOREIGN KEY (sales_id) REFERENCES sales(id) not valid;
|
||||
|
||||
alter table "public"."dealNotes" validate constraint "dealNotes_sales_id_fkey";
|
||||
|
||||
alter table "public"."deals" add constraint "deals_company_id_fkey" FOREIGN KEY (company_id) REFERENCES companies(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
|
||||
|
||||
alter table "public"."deals" validate constraint "deals_company_id_fkey";
|
||||
|
||||
alter table "public"."deals" add constraint "deals_sales_id_fkey" FOREIGN KEY (sales_id) REFERENCES sales(id) not valid;
|
||||
|
||||
alter table "public"."deals" validate constraint "deals_sales_id_fkey";
|
||||
|
||||
alter table "public"."sales" add constraint "sales_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) not valid;
|
||||
|
||||
alter table "public"."sales" validate constraint "sales_user_id_fkey";
|
||||
|
||||
alter table "public"."tasks" add constraint "tasks_contact_id_fkey" FOREIGN KEY (contact_id) REFERENCES contacts(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
|
||||
|
||||
alter table "public"."tasks" validate constraint "tasks_contact_id_fkey";
|
||||
|
||||
set check_function_bodies = off;
|
||||
|
||||
grant delete on table "public"."companies" to "authenticated";
|
||||
grant insert on table "public"."companies" to "authenticated";
|
||||
grant select on table "public"."companies" to "authenticated";
|
||||
grant update on table "public"."companies" to "authenticated";
|
||||
|
||||
grant delete on table "public"."companies" to "service_role";
|
||||
grant insert on table "public"."companies" to "service_role";
|
||||
grant references on table "public"."companies" to "service_role";
|
||||
grant select on table "public"."companies" to "service_role";
|
||||
grant trigger on table "public"."companies" to "service_role";
|
||||
grant truncate on table "public"."companies" to "service_role";
|
||||
grant update on table "public"."companies" to "service_role";
|
||||
|
||||
grant delete on table "public"."contactNotes" to "authenticated";
|
||||
grant insert on table "public"."contactNotes" to "authenticated";
|
||||
grant select on table "public"."contactNotes" to "authenticated";
|
||||
grant update on table "public"."contactNotes" to "authenticated";
|
||||
|
||||
grant delete on table "public"."contactNotes" to "service_role";
|
||||
grant insert on table "public"."contactNotes" to "service_role";
|
||||
grant references on table "public"."contactNotes" to "service_role";
|
||||
grant select on table "public"."contactNotes" to "service_role";
|
||||
grant trigger on table "public"."contactNotes" to "service_role";
|
||||
grant truncate on table "public"."contactNotes" to "service_role";
|
||||
grant update on table "public"."contactNotes" to "service_role";
|
||||
|
||||
grant delete on table "public"."contacts" to "authenticated";
|
||||
grant insert on table "public"."contacts" to "authenticated";
|
||||
grant select on table "public"."contacts" to "authenticated";
|
||||
grant update on table "public"."contacts" to "authenticated";
|
||||
|
||||
grant delete on table "public"."contacts" to "service_role";
|
||||
grant insert on table "public"."contacts" to "service_role";
|
||||
grant references on table "public"."contacts" to "service_role";
|
||||
grant select on table "public"."contacts" to "service_role";
|
||||
grant trigger on table "public"."contacts" to "service_role";
|
||||
grant truncate on table "public"."contacts" to "service_role";
|
||||
grant update on table "public"."contacts" to "service_role";
|
||||
|
||||
grant delete on table "public"."dealNotes" to "authenticated";
|
||||
grant insert on table "public"."dealNotes" to "authenticated";
|
||||
grant select on table "public"."dealNotes" to "authenticated";
|
||||
grant update on table "public"."dealNotes" to "authenticated";
|
||||
|
||||
grant delete on table "public"."dealNotes" to "service_role";
|
||||
grant insert on table "public"."dealNotes" to "service_role";
|
||||
grant references on table "public"."dealNotes" to "service_role";
|
||||
grant select on table "public"."dealNotes" to "service_role";
|
||||
grant trigger on table "public"."dealNotes" to "service_role";
|
||||
grant truncate on table "public"."dealNotes" to "service_role";
|
||||
grant update on table "public"."dealNotes" to "service_role";
|
||||
|
||||
|
||||
grant delete on table "public"."deals" to "authenticated";
|
||||
grant insert on table "public"."deals" to "authenticated";
|
||||
grant select on table "public"."deals" to "authenticated";
|
||||
grant update on table "public"."deals" to "authenticated";
|
||||
|
||||
grant delete on table "public"."deals" to "service_role";
|
||||
grant insert on table "public"."deals" to "service_role";
|
||||
grant references on table "public"."deals" to "service_role";
|
||||
grant select on table "public"."deals" to "service_role";
|
||||
grant trigger on table "public"."deals" to "service_role";
|
||||
grant truncate on table "public"."deals" to "service_role";
|
||||
grant update on table "public"."deals" to "service_role";
|
||||
|
||||
grant delete on table "public"."sales" to "authenticated";
|
||||
grant insert on table "public"."sales" to "authenticated";
|
||||
grant select on table "public"."sales" to "authenticated";
|
||||
grant update on table "public"."sales" to "authenticated";
|
||||
|
||||
grant delete on table "public"."sales" to "service_role";
|
||||
grant insert on table "public"."sales" to "service_role";
|
||||
grant references on table "public"."sales" to "service_role";
|
||||
grant select on table "public"."sales" to "service_role";
|
||||
grant trigger on table "public"."sales" to "service_role";
|
||||
grant truncate on table "public"."sales" to "service_role";
|
||||
grant update on table "public"."sales" to "service_role";
|
||||
|
||||
grant delete on table "public"."tags" to "authenticated";
|
||||
grant insert on table "public"."tags" to "authenticated";
|
||||
grant select on table "public"."tags" to "authenticated";
|
||||
grant update on table "public"."tags" to "authenticated";
|
||||
|
||||
grant delete on table "public"."tags" to "service_role";
|
||||
grant insert on table "public"."tags" to "service_role";
|
||||
grant references on table "public"."tags" to "service_role";
|
||||
grant select on table "public"."tags" to "service_role";
|
||||
grant trigger on table "public"."tags" to "service_role";
|
||||
grant truncate on table "public"."tags" to "service_role";
|
||||
grant update on table "public"."tags" to "service_role";
|
||||
|
||||
grant delete on table "public"."tasks" to "authenticated";
|
||||
grant insert on table "public"."tasks" to "authenticated";
|
||||
grant select on table "public"."tasks" to "authenticated";
|
||||
grant update on table "public"."tasks" to "authenticated";
|
||||
|
||||
grant delete on table "public"."tasks" to "service_role";
|
||||
grant insert on table "public"."tasks" to "service_role";
|
||||
grant references on table "public"."tasks" to "service_role";
|
||||
grant select on table "public"."tasks" to "service_role";
|
||||
grant trigger on table "public"."tasks" to "service_role";
|
||||
grant truncate on table "public"."tasks" to "service_role";
|
||||
grant update on table "public"."tasks" to "service_role";
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."companies"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."companies"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Enable update for authenticated users only"
|
||||
on "public"."companies"
|
||||
as permissive
|
||||
for update
|
||||
to authenticated
|
||||
using (true)
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."contactNotes"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."contactNotes"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."contacts"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."contacts"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Enable update for authenticated users only"
|
||||
on "public"."contacts"
|
||||
as permissive
|
||||
for update
|
||||
to authenticated
|
||||
using (true)
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."dealNotes"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."dealNotes"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."deals"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."deals"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Enable update for authenticated users only"
|
||||
on "public"."deals"
|
||||
as permissive
|
||||
for update
|
||||
to authenticated
|
||||
using (true)
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."sales"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable update for authenticated users only"
|
||||
on "public"."sales"
|
||||
as permissive
|
||||
for update
|
||||
to authenticated
|
||||
using (true)
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."sales"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."tags"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."tags"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Enable insert for authenticated users only"
|
||||
on "public"."tasks"
|
||||
as permissive
|
||||
for insert
|
||||
to authenticated
|
||||
with check (true);
|
||||
|
||||
|
||||
create policy "Enable read access for authenticated users"
|
||||
on "public"."tasks"
|
||||
as permissive
|
||||
for select
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Company Delete Policy"
|
||||
on "public"."companies"
|
||||
as permissive
|
||||
for delete
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Contact Notes Delete Policy"
|
||||
on "public"."contactNotes"
|
||||
as permissive
|
||||
for delete
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Contact Notes Update policy"
|
||||
on "public"."contactNotes"
|
||||
as permissive
|
||||
for update
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Contact Delete Policy"
|
||||
on "public"."contacts"
|
||||
as permissive
|
||||
for delete
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Deal Notes Delete Policy"
|
||||
on "public"."dealNotes"
|
||||
as permissive
|
||||
for delete
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Deal Notes Update Policy"
|
||||
on "public"."dealNotes"
|
||||
as permissive
|
||||
for update
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Deals Delete Policy"
|
||||
on "public"."deals"
|
||||
as permissive
|
||||
for delete
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Task Delete Policy"
|
||||
on "public"."tasks"
|
||||
as permissive
|
||||
for delete
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
create policy "Task Update Policy"
|
||||
on "public"."tasks"
|
||||
as permissive
|
||||
for update
|
||||
to authenticated
|
||||
using (true);
|
||||
|
||||
|
||||
-- Use Postgres to create a bucket.
|
||||
|
||||
insert into storage.buckets
|
||||
(id, name, public)
|
||||
values
|
||||
('attachments', 'attachments', true);
|
||||
|
||||
CREATE POLICY "Attachments 1mt4rzk_0" ON storage.objects FOR SELECT TO authenticated USING (bucket_id = 'attachments');
|
||||
CREATE POLICY "Attachments 1mt4rzk_1" ON storage.objects FOR INSERT TO authenticated WITH CHECK (bucket_id = 'attachments');
|
||||
CREATE POLICY "Attachments 1mt4rzk_3" ON storage.objects FOR DELETE TO authenticated USING (bucket_id = 'attachments');
|
||||
|
||||
-- Use Postgres to create views for companies.
|
||||
|
||||
create view "public"."companies_summary"
|
||||
with (security_invoker=on)
|
||||
as
|
||||
select
|
||||
c.*,
|
||||
count(distinct d.id) as nb_deals,
|
||||
count(distinct co.id) as nb_contacts
|
||||
from
|
||||
"public"."companies" c
|
||||
left join
|
||||
"public"."deals" d on c.id = d.company_id
|
||||
left join
|
||||
"public"."contacts" co on c.id = co.company_id
|
||||
group by
|
||||
c.id;
|
||||
|
||||
-- Use Postgres to create views for contacts.
|
||||
|
||||
create view "public"."contacts_summary"
|
||||
with (security_invoker=on)
|
||||
as
|
||||
select
|
||||
co.*,
|
||||
c.name as company_name,
|
||||
count(distinct t.id) as nb_tasks
|
||||
from
|
||||
"public"."contacts" co
|
||||
left join
|
||||
"public"."tasks" t on co.id = t.contact_id
|
||||
left join
|
||||
"public"."companies" c on co.company_id = c.id
|
||||
group by
|
||||
co.id, c.name;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user