SGEProduto · Domínio · Desenvolvimento
Repositório

migration-reference · implemented

Migration 22 — holidays

Calendário global auditável de feriados nacionais, estaduais e municipais.

Contrato

ColunaTipo PostgreSQLNuloChaves/índicesRegra
idbigintnãoPKIdentificador da data.
datedatenãoíndiceUma data por registro. Feriadão usa uma linha para cada dia.
namevarchar(255)não—Nome apresentado na lista e nos relatórios.
scopevarchar(255)nãoíndiceHolidayScope: national, state ou municipal; validado por HolidayValidationRules e pelo cast do model.
state_codechar(2)simíndice compostoUF validada por BrazilianState. Nula no escopo nacional, obrigatória no estadual e derivada da cidade no municipal.
city_idbigintsimFK, índice compostoCidade do feriado municipal; RESTRICT. Obrigatória nesse escopo.
deleted_attimestamp(0)simparte da unicidadeExclusão lógica via SoftDeletes; permite auditoria e restauração.
created_attimestamp(0)não—Auditoria.
updated_attimestamp(0)não—Auditoria técnica.

Regras de localização

  • national: state_code e city_id devem ser nulos;
  • state: state_code obrigatório e city_id nulo;
  • municipal: city_id obrigatório; o model deriva a UF da cidade e confere uma UF informada;
  • a mesma data pode ter registros nacional, estadual e municipal distintos;
  • feriados diferentes podem ocorrer na mesma data e no mesmo escopo; o mesmo feriado ativo não pode ser duplicado: nacional por data/nome, estadual por data/UF/nome e municipal por data/cidade/nome;
  • a exclusão é lógica (deleted_at); consultas normais ignoram registros excluídos e o Activity Log registra a auditoria;
  • nenhuma consulta de cálculo chama a BrasilAPI.

HolidayValidationRules compartilha as regras de data, nome, escopo, UF e cidade entre o model e a importação. A importação rejeita payloads inválidos antes de persistir qualquer linha; o model mantém ainda as regras relacionais entre escopo, cidade e UF, incluindo a derivação da UF em feriados municipais.

O comando php artisan holidays:import {ano} importa os feriados nacionais da BrasilAPI. Com --uf=RS, importa os nacionais e estaduais retornados para a UF. A chamada usa timeout e retry, ignora pontos facultativos e é idempotente: registros ativos existentes não são sobrescritos. Feriados municipais continuam previstos para cadastro manual quando houver fluxo administrativo.

As migrations do projeto exigem PostgreSQL. A unicidade usa NULLS NOT DISTINCT sobre data, nome, escopo, UF, cidade e deleted_at, permitindo escopos distintos e apenas uma versão ativa de cada feriado.

O Administrador do Sistema será responsável por importar ou cadastrar dados quando a interface existir. O Setor de Estágio consulta e utiliza o calendário, mas não edita o calendário global; suas liberações ou bloqueios para um estágio ficam em internship_calendar_overrides.

Dependências e aplicação

O estágio usa o endereço histórico do local de trabalho para obter a cidade e a UF. O serviço combina os feriados nacionais, estaduais e municipais aplicáveis com a jornada e as pausas. Uma exceção de estágio não altera esta tabela: fica em internship_calendar_overrides. Recessos, feriadões e outros períodos sem atividade são pausas, não registros em holidays.

Checklist

  • Criar migration PostgreSQL com índices por data, localização e unicidade de registros ativos.
  • Criar Model Holiday com SoftDeletes, cast de scope e state_code.
  • Criar importação nacional/estadual idempotente com retry, sem sobrescrever registros.
  • Criar cadastro manual de datas municipais pelo Administrador do Sistema.
  • Testar schema, combinações de escopo/localização, unicidade, soft delete, filtro por UF e importação.
  • Testar campos inválidos no model e na importação sem alterar registros existentes.