Files
seguimiento-impuestos/supabase/actualizacion_final_calendario_y_nomina.sql

211 lines
5.7 KiB
PL/PgSQL

-- Seguimiento de Impuestos GLM
-- Actualización final: contactos regionales de Nómina y enrutamiento global por categoría.
-- Ejecutar una sola vez en Supabase SQL Editor sobre la base ya instalada.
begin;
-- Los contactos ubicados en el país Regional pueden especializarse por categoría:
-- area = regional -> recibe todas las obligaciones
-- area = nomina -> recibe Nómina de todos los países
-- area = admin -> recibe Administración de todos los países
create or replace function public.tax_due_reminders(p_run_date date default current_date)
returns table (
obligation_id uuid,
contact_id uuid,
alert_date date,
alert_type text,
due_date date,
description text,
category text,
country_name text,
country_code text,
contact_name text,
contact_email text,
contact_whatsapp text,
email_enabled boolean,
whatsapp_enabled boolean
)
language sql
stable
security definer
set search_path = ''
as $$
with due as (
select
obligation.id,
obligation.due_date,
obligation.description,
obligation.category,
obligation.country_id,
country.name as country_name,
country.code as country_code,
case
when p_run_date = obligation.due_date then 'same_day'
else 'previous_wednesday'
end as alert_type
from public.tax_obligations obligation
join public.tax_countries country on country.id = obligation.country_id
where obligation.active = true
and (
p_run_date = obligation.due_date
or p_run_date = public.tax_previous_wednesday(obligation.due_date)
)
)
select
due.id as obligation_id,
contact.id as contact_id,
p_run_date as alert_date,
due.alert_type,
due.due_date,
due.description,
due.category,
due.country_name,
due.country_code,
contact.full_name as contact_name,
contact.email as contact_email,
contact.whatsapp_number as contact_whatsapp,
(
contact.email_enabled
and contact.email is not null
and not exists (
select 1
from public.tax_notification_log log
where log.obligation_id = due.id
and log.contact_id = contact.id
and log.alert_date = p_run_date
and log.channel = 'email'
and log.status = 'sent'
)
) as email_enabled,
(
contact.whatsapp_enabled
and contact.whatsapp_number is not null
and not exists (
select 1
from public.tax_notification_log log
where log.obligation_id = due.id
and log.contact_id = contact.id
and log.alert_date = p_run_date
and log.channel = 'whatsapp'
and log.status = 'sent'
)
) as whatsapp_enabled
from due
join public.tax_contacts contact
on contact.active = true
join public.tax_countries contact_country
on contact_country.id = contact.country_id
and (
contact.area = 'regional'
or (
contact_country.is_regional = true
and contact.area = due.category
)
or (
contact.country_id = due.country_id
and contact.area = due.category
)
)
where
(
contact.email_enabled
and contact.email is not null
and not exists (
select 1
from public.tax_notification_log log
where log.obligation_id = due.id
and log.contact_id = contact.id
and log.alert_date = p_run_date
and log.channel = 'email'
and log.status = 'sent'
)
)
or
(
contact.whatsapp_enabled
and contact.whatsapp_number is not null
and not exists (
select 1
from public.tax_notification_log log
where log.obligation_id = due.id
and log.contact_id = contact.id
and log.alert_date = p_run_date
and log.channel = 'whatsapp'
and log.status = 'sent'
)
)
order by due.due_date, due.country_name, contact.full_name;
$$;
revoke all on function public.tax_due_reminders(date) from public, anon, authenticated;
grant execute on function public.tax_due_reminders(date) to service_role;
-- Actualiza los contactos si ya existen.
with regional_country as (
select id
from public.tax_countries
where code = 'REG'
limit 1
),
contact_data(full_name, email, whatsapp_number, job_title) as (
values
('Mati Soto Valenzuela', 'msoto@gomezleemarketing.com', '18094037571', 'Nómina Regional'),
('Iveth Herrera', 'iherrera@gomezleemarketing.com', '50376373732', 'Nómina Regional')
)
update public.tax_contacts contact
set country_id = regional_country.id,
full_name = data.full_name,
whatsapp_number = data.whatsapp_number,
job_title = data.job_title,
area = 'nomina',
email_enabled = true,
whatsapp_enabled = true,
active = true,
updated_at = now()
from contact_data data
cross join regional_country
where lower(contact.email) = lower(data.email);
-- Inserta los contactos que todavía no existen.
with regional_country as (
select id
from public.tax_countries
where code = 'REG'
limit 1
),
contact_data(full_name, email, whatsapp_number, job_title) as (
values
('Mati Soto Valenzuela', 'msoto@gomezleemarketing.com', '18094037571', 'Nómina Regional'),
('Iveth Herrera', 'iherrera@gomezleemarketing.com', '50376373732', 'Nómina Regional')
)
insert into public.tax_contacts (
country_id,
full_name,
email,
whatsapp_number,
job_title,
area,
email_enabled,
whatsapp_enabled,
active
)
select
regional_country.id,
data.full_name,
lower(data.email),
data.whatsapp_number,
data.job_title,
'nomina',
true,
true,
true
from contact_data data
cross join regional_country
where not exists (
select 1
from public.tax_contacts existing
where lower(existing.email) = lower(data.email)
);
commit;