175 lines
5.1 KiB
PL/PgSQL
175 lines
5.1 KiB
PL/PgSQL
-- Seguimiento de Impuestos GLM
|
|
-- Actualización incremental: retirar WhatsApp y habilitar Google Chat.
|
|
-- Ejecutar después de actualizacion_bamboohr_google_calendar.sql.
|
|
|
|
begin;
|
|
|
|
alter table public.tax_contacts
|
|
add column if not exists google_chat_enabled boolean not null default true;
|
|
|
|
alter table public.tax_contacts
|
|
alter column whatsapp_enabled set default false;
|
|
|
|
-- La nueva operación deja de usar WhatsApp. Se conserva la información histórica
|
|
-- para no destruir datos ni bitácoras anteriores.
|
|
update public.tax_contacts
|
|
set
|
|
whatsapp_enabled = false,
|
|
google_chat_enabled = case
|
|
when email_enabled = true and email is not null and length(trim(email)) > 3 then true
|
|
else false
|
|
end;
|
|
|
|
alter table public.tax_contacts
|
|
drop constraint if exists tax_contacts_google_chat_email_when_enabled;
|
|
|
|
alter table public.tax_contacts
|
|
add constraint tax_contacts_google_chat_email_when_enabled
|
|
check (not google_chat_enabled or length(trim(coalesce(email, ''))) > 3);
|
|
|
|
alter table public.tax_notification_log
|
|
drop constraint if exists tax_notification_log_channel_check;
|
|
|
|
alter table public.tax_notification_log
|
|
add constraint tax_notification_log_channel_check
|
|
check (channel in ('email', 'google_chat', 'whatsapp'));
|
|
|
|
-- CREATE OR REPLACE no permite cambiar las columnas retornadas, por eso se elimina
|
|
-- y se recrea la RPC usada por n8n.
|
|
drop function if exists public.tax_due_reminders(date);
|
|
|
|
create 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,
|
|
email_enabled boolean,
|
|
google_chat_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.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.google_chat_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 = 'google_chat'
|
|
and log.status = 'sent'
|
|
)
|
|
) as google_chat_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.google_chat_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 = 'google_chat'
|
|
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;
|
|
|
|
commit;
|
|
|
|
-- Verificación opcional:
|
|
-- select full_name, email_enabled, google_chat_enabled, calendar_enabled, whatsapp_enabled
|
|
-- from public.tax_contacts where active = true order by full_name;
|