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() ));