Code Library

M · UDF

fnHolidaysInPeriodFR

Feriados da França entre duas datas.

Categoria: Data e horaTipo: UDFVersão: v2.0Fonte: Paulo André Jesus — OfficeTuningAtualizado em: 25/09/2026
Documentação completa na Function Library →

Sintaxe

fnHolidaysInPeriodFR(StartDate as date, EndDate as date, optional AlsaceMoselle as nullable logical) as table

Argumentos

NomeTipoObrigatórioDescrição
StartDatedateSimInício do período.
EndDatedateSimFim do período, inclusive.
AlsaceMosellenullable logicalNãotrue inclui Vendredi saint e Saint-Étienne (26/12).

Retorno

table [DateReference = date, HolidayFR = text]

Código completo

let
    fnHolidaysInPeriodFR = (StartDate as date, EndDate as date, optional AlsaceMoselle as nullable logical) as table =>
        let
            fnAno = (y as number) as list =>
                let
                    // Domingo de Páscoa: algoritmo gregoriano anônimo (Meeus/Jones/Butcher)
                    a = Number.Mod(y, 19),
                    b = Number.IntegerDivide(y, 100),
                    c = Number.Mod(y, 100),
                    d = Number.IntegerDivide(b, 4),
                    e = Number.Mod(b, 4),
                    f = Number.IntegerDivide(b + 8, 25),
                    g = Number.IntegerDivide(b - f + 1, 3),
                    h = Number.Mod(19 * a + b - d - g + 15, 30),
                    i = Number.IntegerDivide(c, 4),
                    k = Number.Mod(c, 4),
                    l = Number.Mod(32 + 2 * e + 2 * i - h - k, 7),
                    m = Number.IntegerDivide(a + 11 * h + 22 * l, 451),
                    vPaques = #date(y, Number.IntegerDivide(h + l - 7 * m + 114, 31), Number.Mod(h + l - 7 * m + 114, 31) + 1)
                in
                    {
                        {#date(y, 1, 1), "Jour de l'An"},
                        {Date.AddDays(vPaques, 1), "Lundi de Pâques"},
                        {#date(y, 5, 1), "Fête du Travail"},
                        {#date(y, 5, 8), "Victoire 1945"},
                        {Date.AddDays(vPaques, 39), "Ascension"},
                        {Date.AddDays(vPaques, 50), "Lundi de Pentecôte"},
                        {#date(y, 7, 14), "Fête Nationale"},
                        {#date(y, 8, 15), "Assomption"},
                        {#date(y, 11, 1), "Toussaint"},
                        {#date(y, 11, 11), "Armistice 1918"},
                        {#date(y, 12, 25), "Noël"}
                    }
                    & (if AlsaceMoselle = true
                        then {{Date.AddDays(vPaques, -2), "Vendredi saint"}, {#date(y, 12, 26), "Saint-Étienne"}}
                        else {}),
            vAnos = if EndDate < StartDate then {} else {Date.Year(StartDate) .. Date.Year(EndDate)},
            vTabela = #table(type table [DateReference = date, HolidayFR = text], List.Combine(List.Transform(vAnos, fnAno))),
            vPeriodo = Table.SelectRows(vTabela, each [DateReference] >= StartDate and [DateReference] <= EndDate)
        in
            Table.Sort(vPeriodo, {{"DateReference", Order.Ascending}}),

    Documentacao = [
        Documentation.Name = "fnHolidaysInPeriodFR",
        Documentation.Description = "Feriados da França entre duas datas.",
        Documentation.LongDescription = "Os 11 feriados do Code du travail (art. L3133-1); móveis calculados a partir da Páscoa. Com AlsaceMoselle = true, inclui Vendredi saint e Saint-Étienne. Colunas DateReference e HolidayFR.",
        Documentation.Category = "Data e hora",
        Documentation.Author = "Paulo André Jesus",
        Documentation.Version = "2.0",
        Documentation.Examples = {
            [Description = "2026", Code = "fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31))",
                Result = "11 linhas; Lundi de Pâques 06/04, Ascension 14/05, Lundi de Pentecôte 25/05"],
            [Description = "Alsácia-Mosela", Code = "fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31), true)", Result = "13 linhas"]
        }
    ]
in
    Value.ReplaceType(fnHolidaysInPeriodFR, Value.ReplaceMetadata(Value.Type(fnHolidaysInPeriodFR), Documentacao))

Exemplos

fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31))
// 11 linhas; Lundi de Pâques 06/04, Ascension 14/05, Lundi de Pentecôte 25/05

fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31), true)
// 13 linhas

Dicas e observações

💡 Os 11 feriados do Code du travail, art. L3133-1. ⚠️ A Lundi de Pentecôte costuma ser a journée de solidarité (dia trabalhado). Confirme a regra do cliente antes de tirá-la dos dias úteis. ⚠️ A Ascension pode cair em 01/05 ou 08/05 (01/05/2008): agrupe por data antes de mesclar com o calendário.