let
// === Source ===
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
// === Types (fr-FR) ===
#"Types modifiés" = Table.TransformColumnTypes(
Source,
{
{"Matricule Salarié", type text},
{"Date de Fin de session de paie", type date}
},
"fr-FR"
),
#"Taux converti" = Table.TransformColumns(
#"Types modifiés",
{{"Taux horaire", each if _ is text then Number.FromText(_, "fr-FR") else _, type number}}
),
// === Colonnes utiles ===
#"Colonnes conservées" = Table.SelectColumns(#"Taux converti", {"Matricule Salarié","Date de Fin de session de paie","Taux horaire"}),
// === Année ===
#"Année ajoutée" = Table.AddColumn(#"Colonnes conservées", "Année", each Date.Year([Date de Fin de session de paie]), Int64.Type),
// === N, N-1, N-2 ===
AnnéeMax = List.Max(#"Année ajoutée"[Année]),
N2 = AnnéeMax - 2,
N1 = AnnéeMax - 1,
N = AnnéeMax,
// === Filtre des 3 années ===
#"Filtré 3 années" = Table.SelectRows(#"Année ajoutée", each List.Contains({N2, N1, N}, [Année])),
// === Groupement + extraction "début/fin" ===
#"Groupé" = Table.Group(
#"Filtré 3 années",
{"Matricule Salarié", "Année"},
{
{"TriAsc", each Table.Sort(_, {{"Date de Fin de session de paie", Order.Ascending}}), type table},
{"TriDesc", each Table.Sort(_, {{"Date de Fin de session de paie", Order.Descending}}), type table}
}
),
#"Taux début" = Table.AddColumn(#"Groupé", "Taux Début", each try Table.FirstN([TriAsc],1){0}[Taux horaire] otherwise null, type number),
#"Taux fin" = Table.AddColumn(#"Taux début", "Taux Fin", each try Table.FirstN([TriDesc],1){0}[Taux horaire] otherwise null, type number),
#"Tables tri supprimées" = Table.RemoveColumns(#"Taux fin", {"TriAsc","TriDesc"}),
// === Libellés N/N-1/N-2 ===
LabelForYear = (y as number) as text =>
if y = N then "N (" & Number.ToText(y) & ")"
else if y = N1 then "N-1 (" & Number.ToText(y) & ")"
else if y = N2 then "N-2 (" & Number.ToText(y) & ")"
else Number.ToText(y),
// === Pivot "Début" (en conservant des nombres) ===
#"Col Début" = Table.AddColumn(#"Tables tri supprimées", "ColNameDébut", each "Taux Horaire Début " & LabelForYear([Année]), type text),
#"Début réduit" = Table.SelectColumns(#"Col Début", {"Matricule Salarié","ColNameDébut","Taux Début"}),
#"Pivot Début" = Table.Pivot(#"Début réduit", List.Distinct(#"Début réduit"[ColNameDébut]), "ColNameDébut", "Taux Début", List.First),
// === Pivot "Fin" (en conservant des nombres) ===
#"Col Fin" = Table.AddColumn(#"Tables tri supprimées", "ColNameFin", each "Taux Horaire Fin " & LabelForYear([Année]), type text),
#"Fin réduit" = Table.SelectColumns(#"Col Fin", {"Matricule Salarié","ColNameFin","Taux Fin"}),
#"Pivot Fin" = Table.Pivot(#"Fin réduit", List.Distinct(#"Fin réduit"[ColNameFin]), "ColNameFin", "Taux Fin", List.First),
// === Fusion dynamique ===
#"Fusionné" = Table.NestedJoin(#"Pivot Début", {"Matricule Salarié"}, #"Pivot Fin", {"Matricule Salarié"}, "Fin", JoinKind.FullOuter),
colsFin = List.RemoveItems(Table.ColumnNames(#"Pivot Fin"), {"Matricule Salarié"}),
#"Fusionné étendu" = Table.ExpandTableColumn(#"Fusionné", "Fin", colsFin, colsFin),
// === Colonnes cibles (garantir les 6) ===
ColonnesCibles = {
"Matricule Salarié",
"Taux Horaire Début N-2 (" & Number.ToText(N2) & ")",
"Taux Horaire Fin N-2 (" & Number.ToText(N2) & ")",
"Taux Horaire Début N-1 (" & Number.ToText(N1) & ")",
"Taux Horaire Fin N-1 (" & Number.ToText(N1) & ")",
"Taux Horaire Début N (" & Number.ToText(N) & ")",
"Taux Horaire Fin N (" & Number.ToText(N) & ")"
},
#"Colonnes ajoutées si manquantes" =
List.Accumulate(
List.RemoveFirstN(ColonnesCibles, 1),
#"Fusionné étendu",
(state, col) => if List.Contains(Table.ColumnNames(state), col) then state else Table.AddColumn(state, col, each null, type number)
),
// === Réordonner (toutes colonnes numériques, null si absent) ===
#"Colonnes réordonnées" = Table.ReorderColumns(#"Colonnes ajoutées si manquantes", ColonnesCibles)
in
#"Colonnes réordonnées"