feat: agregar generación de reportes PDF y recomendaciones para PDVs sin asignar

This commit is contained in:
2026-09-26 10:10:52 -04:00
parent 23e01f398b
commit b3d6653143
49 changed files with 1635 additions and 906 deletions
+102
View File
@@ -0,0 +1,102 @@
create table if not exists public.rutero_proyecto_empleados (
id uuid primary key default gen_random_uuid(),
proyecto_id uuid not null references public.rutero_proyectos(id) on delete cascade,
employee_code text not null,
nombre text not null,
usuario text,
email text,
perfil text,
pais text,
regional text,
latitud double precision not null,
longitud double precision not null,
horas_por_dia numeric(5,2) not null default 8,
dias_por_semana integer not null default 5,
jornada_codigo text not null default 'LUN_VIE_40',
horas_descanso_por_dia numeric(4,2) not null default 1,
dias_descanso jsonb not null default '[]'::jsonb,
visitas_maximas_por_dia integer not null default 3,
activo boolean not null default true,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now(),
unique (proyecto_id, employee_code),
constraint rutero_proyecto_empleados_jornada_valida check (jornada_codigo in ('LUN_DOM_44', 'LUN_SAB_40', 'LUN_SAB_44', 'LUN_VIE_40')),
constraint rutero_proyecto_empleados_descanso_valido check (horas_descanso_por_dia >= 0 and horas_descanso_por_dia <= 3),
constraint rutero_proyecto_empleados_visitas_validas check (visitas_maximas_por_dia > 0)
);
create index if not exists rutero_proyecto_empleados_proyecto_idx
on public.rutero_proyecto_empleados (proyecto_id);
-- Preserve current behavior once: copy the existing global catalog into every
-- existing project. From this point onward each copy is edited independently.
insert into public.rutero_proyecto_empleados (
proyecto_id, employee_code, nombre, usuario, email, perfil, pais, regional,
latitud, longitud, horas_por_dia, dias_por_semana, jornada_codigo,
horas_descanso_por_dia, dias_descanso, visitas_maximas_por_dia, activo
)
select proyecto.id, empleado.employee_code, empleado.nombre, empleado.usuario,
empleado.email, empleado.perfil, empleado.pais, empleado.regional,
empleado.latitud, empleado.longitud, empleado.horas_por_dia,
empleado.dias_por_semana, empleado.jornada_codigo,
empleado.horas_descanso_por_dia, empleado.dias_descanso,
empleado.visitas_maximas_por_dia, empleado.activo
from public.rutero_proyectos proyecto
cross join public.rutero_empleados empleado
on conflict (proyecto_id, employee_code) do nothing;
alter table public.rutero_proyecto_empleados enable row level security;
drop policy if exists "Consultar empleados de proyectos propios" on public.rutero_proyecto_empleados;
drop policy if exists "Crear empleados en proyectos propios" on public.rutero_proyecto_empleados;
drop policy if exists "Editar empleados de proyectos propios" on public.rutero_proyecto_empleados;
drop policy if exists "Eliminar empleados de proyectos propios" on public.rutero_proyecto_empleados;
create policy "Consultar empleados de proyectos propios"
on public.rutero_proyecto_empleados for select to authenticated
using (exists (
select 1 from public.rutero_proyectos proyecto
where proyecto.id = proyecto_id and proyecto.propietario_id = auth.uid()
));
create policy "Crear empleados en proyectos propios"
on public.rutero_proyecto_empleados for insert to authenticated
with check (exists (
select 1 from public.rutero_proyectos proyecto
where proyecto.id = proyecto_id and proyecto.propietario_id = auth.uid()
));
create policy "Editar empleados de proyectos propios"
on public.rutero_proyecto_empleados for update to authenticated
using (exists (
select 1 from public.rutero_proyectos proyecto
where proyecto.id = proyecto_id and proyecto.propietario_id = auth.uid()
))
with check (exists (
select 1 from public.rutero_proyectos proyecto
where proyecto.id = proyecto_id and proyecto.propietario_id = auth.uid()
));
create policy "Eliminar empleados de proyectos propios"
on public.rutero_proyecto_empleados for delete to authenticated
using (exists (
select 1 from public.rutero_proyectos proyecto
where proyecto.id = proyecto_id and proyecto.propietario_id = auth.uid()
));
create unique index if not exists rutero_proyecto_pdvs_proyecto_pdv_idx
on public.rutero_proyecto_pdvs (proyecto_id, pdv_id);
alter table public.rutero_proyecto_pdvs enable row level security;
drop policy if exists "Gestionar PDVs de proyectos propios" on public.rutero_proyecto_pdvs;
create policy "Gestionar PDVs de proyectos propios"
on public.rutero_proyecto_pdvs for all to authenticated
using (exists (
select 1 from public.rutero_proyectos proyecto
where proyecto.id = proyecto_id and proyecto.propietario_id = auth.uid()
))
with check (exists (
select 1 from public.rutero_proyectos proyecto
where proyecto.id = proyecto_id and proyecto.propietario_id = auth.uid()
));