Skip to content

Commit

Permalink
fix: sref (#5232)
Browse files Browse the repository at this point in the history
  • Loading branch information
maxgfr authored Jun 27, 2023
1 parent 5a1d9d9 commit 5e5c231
Show file tree
Hide file tree
Showing 7 changed files with 350 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ export class AgreementSalary2596 implements AgreementSalary {
return sReference.computeReferenceSalary({
salairesPendantPreavis: ccInput.noticeSalaryPeriods ?? [],
salaires: salaryPeriods,
catPro: get()
.informationsData.input.publicodesInformations.find(
(v) =>
v.question.rule.nom ===
"contrat salarié . convention collective . coiffure . indemnité de licenciement . catégorie professionnelle"
)
?.info?.slice(1, -1) as any,
});
};
}
12 changes: 12 additions & 0 deletions packages/code-du-travail-modeles/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"jsc": {
"parser": {
"syntax": "typescript"
},
"target": "es5"
},
"module": {
"type": "commonjs"
},
"sourceMaps": true
}
8 changes: 5 additions & 3 deletions packages/code-du-travail-modeles/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
},
"devDependencies": {
"@socialgouv/eslint-config-typescript": "^1.93.0",
"@swc/core": "^1.3.21",
"@swc/jest": "^0.2.23",
"@swc/cli": "^0.1.62",
"@swc/core": "^1.3.66",
"@swc/jest": "^0.2.26",
"@types/fs-extra": "^9.0.12",
"@types/jest": "^27.0.1",
"eslint": "^7.32.0",
Expand All @@ -30,9 +31,10 @@
"prebuild": "tsc",
"test": "jest --silent=true",
"lint": "eslint \"./src/**/*.{js,ts}\"",
"dev": "nodemon --exec 'npm run build' --watch 'src/**' --ext 'ts,yaml'",
"dev": "nodemon --exec 'npm run build:dev' --watch 'src/**' --ext 'ts,yaml'",
"test:watch": "nodemon --exec 'jest' --watch 'src/**' --ext 'ts,yaml'",
"build": "yarn prebuild && node bin/internal/build.js",
"build:dev": "swc ./src --out-dir bin --copy-files && node bin/internal/build.js",
"clean": "rimraf bin lib",
"type-check": "tsc --noEmit",
"type-check:watch": "npm run type-check -- --watch"
Expand Down
12 changes: 8 additions & 4 deletions packages/code-du-travail-modeles/src/internal/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,14 @@ function copyJSFile() {
path.resolve(inDir, "index.js"),
path.resolve(outDir, "index.js")
);
fs.copyFileSync(
path.resolve(inDir, "index.d.ts"),
path.resolve(outDir, "index.d.ts")
);
try {
fs.copyFileSync(
path.resolve(inDir, "index.d.ts"),
path.resolve(outDir, "index.d.ts")
);
} catch {
console.log("Cannot copy *.d.ts because we are in dev mode 👀");
}
fse.copySync(`${inDir}/publicodes`, `${outDir}/publicodes`);
fse.copySync(`${inDir}/modeles`, `${outDir}/modeles`);
fse.copySync(`${inDir}/simulators`, `${outDir}/simulators`);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,80 +1,169 @@
import { ReferenceSalary2596 } from "../../salary";
import { CatPro2596, ReferenceSalary2596 } from "../../salary";

describe("Calcul du salaire pour la CC 2596", () => {
const ReferenceSalary = new ReferenceSalary2596();

it("Cas d'usage basique", () => {
expect(
ReferenceSalary.computeReferenceSalary({
salaires: [
{ month: "janvier", value: 2000 },
{ month: "février", value: 2000 },
{ month: "mars", value: 2000 },
],
salairesPendantPreavis: [],
})
).toEqual(2000);
});
it("Avec des primes pendant le préavis", () => {
expect(
ReferenceSalary.computeReferenceSalary({
salaires: [{ month: "janvier", value: 2000 }],
salairesPendantPreavis: [
{ month: "février", prime: 1000, value: 2000 },
],
})
).toEqual(2500);
});
describe("Cadres ou agents de maîtrise", () => {
it("Cas d'usage basique", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.cadres,
salaires: [
{ month: "janvier", value: 2000 },
{ month: "février", value: 2000 },
{ month: "mars", value: 2000 },
],
salairesPendantPreavis: [],
})
).toEqual(2000);
});
it("Avec des primes pendant le préavis", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.cadres,
salaires: [{ month: "janvier", value: 2000 }],
salairesPendantPreavis: [
{ month: "février", prime: 1000, value: 2000 },
],
})
).toEqual(2500);
});

it("Avec un salaire différent sur deux mois", () => {
expect(
ReferenceSalary.computeReferenceSalary({
salaires: [
{ month: "février", value: 2000 },
{ month: "janvier", value: 2000 },
],
salairesPendantPreavis: [
{ month: "avril", value: 5000 },
{ month: "mars", value: 5000 },
],
})
).toEqual(3500);
});
it("Avec un salaire différent sur deux mois", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.cadres,
salaires: [
{ month: "février", value: 2000 },
{ month: "janvier", value: 2000 },
],
salairesPendantPreavis: [
{ month: "avril", value: 5000 },
{ month: "mars", value: 5000 },
],
})
).toEqual(3500);
});

it("Avec un salaire différent sur 1 mois de préavis", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.cadres,
salaires: [
{ month: "décembre", value: 2000 },
{ month: "novembre", value: 2000 },
{ month: "octobre", value: 2000 },
{ month: "septembre", value: 2000 },
{ month: "aout", value: 2000 },
{ month: "juillet", value: 2000 },
{ month: "juin", value: 2000 },
{ month: "mai", value: 2000 },
{ month: "avril", value: 2000 },
{ month: "mars", value: 2000 },
{ month: "février", value: 2000 },
{ month: "janvier", value: 2000 },
],
salairesPendantPreavis: [
{ month: "janvier", prime: 2500, value: 1500 },
],
})
).toEqual(2166.6666666666665);
});

it("Avec un salaire différent sur 1 mois de préavis", () => {
expect(
ReferenceSalary.computeReferenceSalary({
salaires: [
{ month: "décembre", value: 2000 },
{ month: "novembre", value: 2000 },
{ month: "octobre", value: 2000 },
{ month: "septembre", value: 2000 },
{ month: "aout", value: 2000 },
{ month: "juillet", value: 2000 },
{ month: "juin", value: 2000 },
{ month: "mai", value: 2000 },
{ month: "avril", value: 2000 },
{ month: "mars", value: 2000 },
{ month: "février", value: 2000 },
{ month: "janvier", value: 2000 },
],
salairesPendantPreavis: [
{ month: "janvier", prime: 2500, value: 1500 },
],
})
).toEqual(2166.6666666666665);
it("Avec un salaire différent sur trois mois et trois primes", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.cadres,
salaires: [
{ month: "mars", value: 2500 },
{ month: "février", value: 2500 },
{ month: "janvier", value: 2500 },
],
salairesPendantPreavis: [{ month: "avril", prime: 60, value: 2500 }],
})
).toEqual(2515);
});
});

it("Avec un salaire différent sur trois mois et trois primes", () => {
expect(
ReferenceSalary.computeReferenceSalary({
salaires: [
{ month: "mars", value: 2500 },
{ month: "février", value: 2500 },
{ month: "janvier", value: 2500 },
],
salairesPendantPreavis: [{ month: "avril", prime: 60, value: 2500 }],
})
).toEqual(2515);
describe("Autres catégories", () => {
it("Cas d'usage basique", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.coiffeur,
salaires: [
{ month: "janvier", value: 2000 },
{ month: "février", value: 2000 },
{ month: "mars", value: 2000 },
],
salairesPendantPreavis: [],
})
).toEqual(2000);
});
it("Avec des primes pendant le préavis", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.coiffeur,
salaires: [{ month: "janvier", value: 2000 }],
salairesPendantPreavis: [
{ month: "février", prime: 1000, value: 2000 },
],
})
).toEqual(2000);
});

it("Avec un salaire différent sur deux mois", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.coiffeur,
salaires: [
{ month: "février", value: 2000 },
{ month: "janvier", value: 2000 },
],
salairesPendantPreavis: [
{ month: "avril", value: 5000 },
{ month: "mars", value: 5000 },
],
})
).toEqual(2000);
});

it("Avec un salaire différent sur 1 mois de préavis", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.coiffeur,
salaires: [
{ month: "décembre", value: 2000 },
{ month: "novembre", value: 2000 },
{ month: "octobre", value: 2000 },
{ month: "septembre", value: 2000 },
{ month: "aout", value: 2000 },
{ month: "juillet", value: 2000 },
{ month: "juin", value: 2000 },
{ month: "mai", value: 2000 },
{ month: "avril", value: 2000 },
{ month: "mars", value: 2000 },
{ month: "février", value: 2000 },
{ month: "janvier", value: 2000 },
],
salairesPendantPreavis: [
{ month: "janvier", prime: 2500, value: 1500 },
],
})
).toEqual(2000);
});

it("Avec un salaire différent sur trois mois et trois primes", () => {
expect(
ReferenceSalary.computeReferenceSalary({
catPro: CatPro2596.coiffeur,
salaires: [
{ month: "mars", value: 2500 },
{ month: "février", value: 2500 },
{ month: "janvier", value: 2500 },
],
salairesPendantPreavis: [{ month: "avril", prime: 60, value: 2500 }],
})
).toEqual(2500);
});
});
});
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { ReferenceSalaryLegal } from "../../base";
import type {
IReferenceSalary,
ReferenceSalaryProps,
Expand All @@ -6,41 +7,56 @@ import type {
} from "../../common";
import { nonNullable, rankByMonthArrayDescFrench, sum } from "../../common";

export enum CatPro2596 {
agentsMaitrise = "Agents de maîtrise",
cadres = "Cadres",
coiffeur = "Emplois techniques et de coiffeurs",
esthetique = "Emplois de l'esthétique-cosmétique",
nonTechnique = "Emplois non techniques",
}

export type CC2596ReferenceSalaryProps = {
salaires: SalaryPeriods[];
catPro: CatPro2596;
salairesPendantPreavis: SalaryPeriods[];
};

export class ReferenceSalary2596
implements IReferenceSalary<SupportedCcIndemniteLicenciement.IDCC2596>
{
/**
* Règle :
* S/12
* S : total des salaires perçus lors des 12 derniers mois de présence dans l'entreprise (brut, préavis inclu)
**/
computeReferenceSalary({
salaires,
salairesPendantPreavis,
salaires = [],
salairesPendantPreavis = [],
catPro,
}: ReferenceSalaryProps<SupportedCcIndemniteLicenciement.IDCC2596>): number {
const rankedSalaires = rankByMonthArrayDescFrench(salaires);
const rankedSalairesPendantPreavis = rankByMonthArrayDescFrench(
salairesPendantPreavis
);
const salaryValues = rankedSalaires.map((a) => a.value).filter(nonNullable);
if (
catPro === CatPro2596.coiffeur ||
catPro === CatPro2596.esthetique ||
catPro === CatPro2596.nonTechnique
) {
return new ReferenceSalaryLegal().computeReferenceSalary({ salaires });
} else {
const rankedSalaires = rankByMonthArrayDescFrench(salaires);
const rankedSalairesPendantPreavis = rankByMonthArrayDescFrench(
salairesPendantPreavis
);
const salaryValues = rankedSalaires
.map((a) => a.value)
.filter(nonNullable);

const totalSalaryValues = [
...rankedSalairesPendantPreavis.map((a) => a.value).filter(nonNullable),
...salaryValues,
].slice(0, 12);
const totalSalaryValues = [
...rankedSalairesPendantPreavis.map((a) => a.value).filter(nonNullable),
...salaryValues,
].slice(0, 12);

const primesPendantPreavis = rankedSalairesPendantPreavis
.map((v) => v.prime)
.filter(nonNullable);
const primesPendantPreavis = rankedSalairesPendantPreavis
.map((v) => v.prime)
.filter(nonNullable);

return (
(sum(totalSalaryValues) + sum(primesPendantPreavis)) /
totalSalaryValues.length
);
return (
(sum(totalSalaryValues) + sum(primesPendantPreavis)) /
totalSalaryValues.length
);
}
}
}
Loading

0 comments on commit 5e5c231

Please sign in to comment.