Versión inicial de Seguimiento de Impuestos GLM
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user