salaire : reformat + correction bug logé / nourri

This commit is contained in:
Antoine Pierlot-Garcin 2023-11-16 14:17:17 +01:00
parent 5d2ffae186
commit 6db310efee
1 changed files with 313 additions and 239 deletions

View File

@ -7,78 +7,78 @@
let anneeInternat: string = '1re'; let anneeInternat: string = '1re';
let isLogé: boolean = false; let isLogé: boolean = false;
let isNourri: boolean = true; let isNourri: boolean = true;
let medGeOuSpe: string = "spe"; let medGeOuSpe: string = 'spe';
let aPrimeSaspas: boolean = false; let aPrimeSaspas: boolean = false;
let aIndemnite15km: boolean = false; let aIndemnite15km: boolean = false;
let aIndemniteZipZac: boolean = false; let aIndemniteZipZac: boolean = false;
let estUltramarin: boolean = false; let estUltramarin: boolean = false;
let nbDemiGardes: number = 0; let nbDemiGardes: number = 0;
let nbGardesSem : number = 0; let nbGardesSem: number = 0;
let nbGardesWE : number = 0; let nbGardesWE: number = 0;
let nbAstreintes : number = 0; let nbAstreintes: number = 0;
let nbDeplacements: number = 0; let nbDeplacements: number = 0;
const annees = ['FFI', '1re', '2e', '3e', '4e', '5e', 'DJ1', 'DJ2']; const annees = ['FFI', '1re', '2e', '3e', '4e', '5e', 'DJ1', 'DJ2'];
const bases = recupBasesLegales(2023, 10); const bases = recupBasesLegales(2023, 10);
// Salaire de base et idemnités // Salaire de base et idemnités
let base : number = 0; let base: number = 0;
let indemniteSujetion : number = 0; let indemniteSujetion: number = 0;
let indemniteSujetionLabel : string = ""; let indemniteSujetionLabel: string = '';
let indemniteSujetionRetraite : number = 0; let indemniteSujetionRetraite: number = 0;
$: switch(anneeInternat) { $: switch (anneeInternat) {
case "FFI": case 'FFI':
base = parseFloat(bases.baseFFI) / 12; base = parseFloat(bases.baseFFI) / 12;
indemniteSujetion = parseFloat(bases.indemniteSujetion); indemniteSujetion = parseFloat(bases.indemniteSujetion);
indemniteSujetionLabel = "Indemnité de sujetion"; indemniteSujetionLabel = 'Indemnité de sujetion';
indemniteSujetionRetraite = 0; indemniteSujetionRetraite = 0;
break; break;
case "1re": case '1re':
base = parseFloat(bases.base1ere) / 12; base = parseFloat(bases.base1ere) / 12;
indemniteSujetion = parseFloat(bases.indemniteSujetion); indemniteSujetion = parseFloat(bases.indemniteSujetion);
indemniteSujetionLabel = "Indemnité de sujetion"; indemniteSujetionLabel = 'Indemnité de sujetion';
indemniteSujetionRetraite = 0; indemniteSujetionRetraite = 0;
break; break;
case "2e": case '2e':
base = parseFloat(bases.base2e) / 12; base = parseFloat(bases.base2e) / 12;
indemniteSujetion = parseFloat(bases.indemniteSujetion); indemniteSujetion = parseFloat(bases.indemniteSujetion);
indemniteSujetionLabel = "Indemnité de sujetion"; indemniteSujetionLabel = 'Indemnité de sujetion';
indemniteSujetionRetraite = 0; indemniteSujetionRetraite = 0;
break; break;
case "3e": case '3e':
base = parseFloat(bases.base3e) / 12; base = parseFloat(bases.base3e) / 12;
indemniteSujetion = 0; indemniteSujetion = 0;
indemniteSujetionLabel = ""; indemniteSujetionLabel = '';
indemniteSujetionRetraite = 0; indemniteSujetionRetraite = 0;
break; break;
case "4e": case '4e':
base = parseFloat(bases.base4e) / 12; base = parseFloat(bases.base4e) / 12;
indemniteSujetion = parseFloat(bases.primeResp4eme) / 12; indemniteSujetion = parseFloat(bases.primeResp4eme) / 12;
indemniteSujetionLabel = "Prime de responsabilité"; indemniteSujetionLabel = 'Prime de responsabilité';
indemniteSujetionRetraite = indemniteSujetion; indemniteSujetionRetraite = indemniteSujetion;
break; break;
case "5e": case '5e':
base = parseFloat(bases.base5e) / 12; base = parseFloat(bases.base5e) / 12;
indemniteSujetion = parseFloat(bases.primeResp5eme) / 12; indemniteSujetion = parseFloat(bases.primeResp5eme) / 12;
indemniteSujetionLabel = "Prime de responsabilité"; indemniteSujetionLabel = 'Prime de responsabilité';
indemniteSujetionRetraite = indemniteSujetion; indemniteSujetionRetraite = indemniteSujetion;
break; break;
case "DJ1": case 'DJ1':
base = parseFloat(bases.baseDJ1) / 12; base = parseFloat(bases.baseDJ1) / 12;
indemniteSujetion = parseFloat(bases.primeDJ1re) / 12; indemniteSujetion = parseFloat(bases.primeDJ1re) / 12;
indemniteSujetionLabel = "Prime d'autonomie supervisée"; indemniteSujetionLabel = "Prime d'autonomie supervisée";
indemniteSujetionRetraite = indemniteSujetion; indemniteSujetionRetraite = indemniteSujetion;
break; break;
case "DJ2": case 'DJ2':
base = parseFloat(bases.baseDJ2) / 12; base = parseFloat(bases.baseDJ2) / 12;
indemniteSujetion = parseFloat(bases.primeDJ2eme) / 12; indemniteSujetion = parseFloat(bases.primeDJ2eme) / 12;
indemniteSujetionLabel = "Prime d'autonomie supervisée"; indemniteSujetionLabel = "Prime d'autonomie supervisée";
@ -87,18 +87,18 @@
default: default:
console.error("Année d'internat mal choisie"); console.error("Année d'internat mal choisie");
} }
// Prime logé - nourri // Prime logé - nourri
let primeLogeNourri : number = 0; let primeLogeNourri: number = 0;
$: if (isNourri) { $: if (!isNourri) {
if (isLogé) { if (!isLogé) {
primeLogeNourri = parseFloat(bases.primeNonLogeNonNourri) / 12; primeLogeNourri = parseFloat(bases.primeNonLogeNonNourri) / 12;
} else { } else {
primeLogeNourri = parseFloat(bases.primeLogeNonNourri) / 12; primeLogeNourri = parseFloat(bases.primeLogeNonNourri) / 12;
} }
} else { } else {
if (isLogé) { if (!isLogé) {
primeLogeNourri = parseFloat(bases.primeNonLogeNourri) / 12; primeLogeNourri = parseFloat(bases.primeNonLogeNourri) / 12;
} else { } else {
primeLogeNourri = 0; primeLogeNourri = 0;
@ -106,9 +106,11 @@ $: if (isNourri) {
} }
// Prime SASPAS et indemnité transport et indemnité d'hébergement // Prime SASPAS et indemnité transport et indemnité d'hébergement
$: primeSASPAS = (medGeOuSpe === "mg") && aPrimeSaspas ? parseFloat(bases.primeSASPAS) : 0; $: primeSASPAS = medGeOuSpe === 'mg' && aPrimeSaspas ? parseFloat(bases.primeSASPAS) : 0;
$: indemniteTransport = (medGeOuSpe === "mg") && aIndemnite15km ? parseFloat(bases.indemniteDeplacement) : 0; $: indemniteTransport =
$: indemniteHebergement = (medGeOuSpe === "mg") && aIndemniteZipZac ? parseFloat(bases.indemniteHebergement) : 0; medGeOuSpe === 'mg' && aIndemnite15km ? parseFloat(bases.indemniteDeplacement) : 0;
$: indemniteHebergement =
medGeOuSpe === 'mg' && aIndemniteZipZac ? parseFloat(bases.indemniteHebergement) : 0;
// Prime Outremer // Prime Outremer
$: tauxPrimeOutremer = estUltramarin ? parseFloat(bases.tauxPrimeOutremer) : 0; $: tauxPrimeOutremer = estUltramarin ? parseFloat(bases.tauxPrimeOutremer) : 0;
@ -121,18 +123,19 @@ $: if (isNourri) {
$: valDeplacement = parseFloat(bases.deplaAstreinte); $: valDeplacement = parseFloat(bases.deplaAstreinte);
// == TOTAL BRUT == // == TOTAL BRUT ==
$: totalBrut = base $: totalBrut =
+ indemniteSujetion base +
+ primeLogeNourri indemniteSujetion +
+ primeSASPAS primeLogeNourri +
+ indemniteTransport primeSASPAS +
+ indemniteHebergement indemniteTransport +
+ tauxPrimeOutremer * base / 100 indemniteHebergement +
+ nbDemiGardes * valDemiGarde (tauxPrimeOutremer * base) / 100 +
+ nbGardesSem * valGardeSem nbDemiGardes * valDemiGarde +
+ nbGardesWE * valGardeWE nbGardesSem * valGardeSem +
+ nbAstreintes * valAstreinte nbGardesWE * valGardeWE +
+ nbDeplacements * valDeplacement; nbAstreintes * valAstreinte +
nbDeplacements * valDeplacement;
// Contribution sociale généralisée (CSG) et remboursement de la dette sociale (CRDS) // Contribution sociale généralisée (CSG) et remboursement de la dette sociale (CRDS)
$: baseCsgRds = totalBrut * parseFloat(bases.assietteCSGCRDS); $: baseCsgRds = totalBrut * parseFloat(bases.assietteCSGCRDS);
@ -141,33 +144,36 @@ $: if (isNourri) {
$: tauxCRDS = parseFloat(bases.tauxCRDS); $: tauxCRDS = parseFloat(bases.tauxCRDS);
// Retraite IRCANTEC // Retraite IRCANTEC
$: baseRetraite = (base + indemniteSujetionRetraite + indemniteTransport + indemniteHebergement + primeSASPAS) * 2/3; $: baseRetraite =
((base + indemniteSujetionRetraite + indemniteTransport + indemniteHebergement + primeSASPAS) *
2) /
3;
$: plafondSS = parseFloat(bases.plafondSS); $: plafondSS = parseFloat(bases.plafondSS);
$: baseIrcantecA = (baseRetraite > plafondSS) ? plafondSS : baseRetraite; $: baseIrcantecA = baseRetraite > plafondSS ? plafondSS : baseRetraite;
$: baseIrcantecB = (baseRetraite > plafondSS) ? baseRetraite - plafondSS : 0; $: baseIrcantecB = baseRetraite > plafondSS ? baseRetraite - plafondSS : 0;
$: tauxIrcantecA = parseFloat(bases.IRCANTECTrA); $: tauxIrcantecA = parseFloat(bases.IRCANTECTrA);
$: tauxIrcantecB = parseFloat(bases.IRCANTECTrB); $: tauxIrcantecB = parseFloat(bases.IRCANTECTrB);
// Sécurité sociale // Sécurité sociale
$: basePlafonnee = (totalBrut > plafondSS) ? plafondSS : totalBrut; $: basePlafonnee = totalBrut > plafondSS ? plafondSS : totalBrut;
$: tauxVieillessePlafonee = parseFloat(bases.tauxAssuranceViellessePlafonee); $: tauxVieillessePlafonee = parseFloat(bases.tauxAssuranceViellessePlafonee);
$: tauxVieillesseDeplafonee = parseFloat(bases.tauxAssuranceViellesseDeplaf); $: tauxVieillesseDeplafonee = parseFloat(bases.tauxAssuranceViellesseDeplaf);
// == TOTAL NET AVANT IMPOTS == // == TOTAL NET AVANT IMPOTS ==
$: totalNetFiscal = totalBrut $: totalNetFiscal =
- baseCsgRds * tauxCSGDeductible / 100 totalBrut -
- baseIrcantecA * tauxIrcantecA / 100 (baseCsgRds * tauxCSGDeductible) / 100 -
- baseIrcantecB * tauxIrcantecB / 100 (baseIrcantecA * tauxIrcantecA) / 100 -
- totalBrut * tauxVieillesseDeplafonee / 100 (baseIrcantecB * tauxIrcantecB) / 100 -
- basePlafonnee * tauxVieillessePlafonee / 100; (totalBrut * tauxVieillesseDeplafonee) / 100 -
$: totalNetAvantImpots = totalNetFiscal (basePlafonnee * tauxVieillessePlafonee) / 100;
- baseCsgRds * tauxCSGNonDeductible / 100 $: totalNetAvantImpots =
- baseCsgRds * tauxCRDS / 100; totalNetFiscal - (baseCsgRds * tauxCSGNonDeductible) / 100 - (baseCsgRds * tauxCRDS) / 100;
// Impots à la source // Impots à la source
let tauxSource : number = 0; let tauxSource: number = 0;
$: totalNet = totalNetAvantImpots - (totalNetFiscal * tauxSource / 100); $: totalNet = totalNetAvantImpots - (totalNetFiscal * tauxSource) / 100;
</script> </script>
{@debug base, totalBrut, totalNet} {@debug base, totalBrut, totalNet}
@ -176,7 +182,7 @@ $: if (isNourri) {
<div class="grid gap-3 grid-cols-5 items-center"> <div class="grid gap-3 grid-cols-5 items-center">
<div> <div>
<label class="label" for="dateSalaire"><span>Date d'effet</span></label> <label class="label" for="dateSalaire"><span>Date d'effet</span></label>
<input id="dateSalaire" value="Date" disabled/> <input id="dateSalaire" value="Date" disabled />
</div> </div>
<div class="col-span-3 overflow-x-auto flex"> <div class="col-span-3 overflow-x-auto flex">
<div class="grow" /> <div class="grow" />
@ -189,7 +195,6 @@ $: if (isNourri) {
</RadioGroup> </RadioGroup>
</div> </div>
<div class="grow" /> <div class="grow" />
</div> </div>
<div class="flex flex-col gap-1"> <div class="flex flex-col gap-1">
<SlideToggle name="slider-logé" bind:checked={isLogé}>Logé</SlideToggle> <SlideToggle name="slider-logé" bind:checked={isLogé}>Logé</SlideToggle>
@ -202,14 +207,16 @@ $: if (isNourri) {
<RadioItem bind:group={medGeOuSpe} name="medGeOuSpe" value="spe">Spé</RadioItem> <RadioItem bind:group={medGeOuSpe} name="medGeOuSpe" value="spe">Spé</RadioItem>
</RadioGroup> </RadioGroup>
</div> </div>
<div class:invisible={medGeOuSpe === "spe"} class="flex justify-left pl-3"> <div class:invisible={medGeOuSpe === 'spe'} class="flex justify-left pl-3">
<SlideToggle name="slider-saspas" bind:checked={aPrimeSaspas}>SASPAS</SlideToggle> <SlideToggle name="slider-saspas" bind:checked={aPrimeSaspas}>SASPAS</SlideToggle>
</div> </div>
<div class:invisible={medGeOuSpe === "spe"} class="flex justify-left pl-3"> <div class:invisible={medGeOuSpe === 'spe'} class="flex justify-left pl-3">
<SlideToggle name="slider-15km" bind:checked={aIndemnite15km}>Stage &gt; 15 km</SlideToggle> <SlideToggle name="slider-15km" bind:checked={aIndemnite15km}>Stage &gt; 15 km</SlideToggle>
</div> </div>
<div class:invisible={medGeOuSpe === "spe"} class="flex justify-left pl-3"> <div class:invisible={medGeOuSpe === 'spe'} class="flex justify-left pl-3">
<SlideToggle name="slider-zipzac" bind:checked={aIndemniteZipZac}>Indemnité hébergement</SlideToggle> <SlideToggle name="slider-zipzac" bind:checked={aIndemniteZipZac}
>Indemnité hébergement</SlideToggle
>
</div> </div>
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
@ -226,7 +233,7 @@ $: if (isNourri) {
</div> </div>
<div class="col-span-5 flex flex-col md:flex-row"> <div class="col-span-5 flex flex-col md:flex-row">
<span>Taux de prélèvement à la source : {tauxSource} %</span> <span>Taux de prélèvement à la source : {tauxSource} %</span>
<input type="range" bind:value={tauxSource} max="20" step="0.5"/> <input type="range" bind:value={tauxSource} max="20" step="0.5" />
</div> </div>
</div> </div>
@ -238,20 +245,60 @@ $: if (isNourri) {
<div class="flex-none w-16">Nb/Taux</div> <div class="flex-none w-16">Nb/Taux</div>
<div class="flex-none w-24">Total</div> <div class="flex-none w-24">Total</div>
</div> </div>
<LigneSalaire type="brut" label="Traitement de base" base={base} /> <LigneSalaire type="brut" label="Traitement de base" {base} />
<LigneSalaire type="taux" label="Prime outremer" opt={true} base={base} taux={tauxPrimeOutremer} /> <LigneSalaire type="taux" label="Prime outremer" opt={true} {base} taux={tauxPrimeOutremer} />
<LigneSalaire type="brut" label={indemniteSujetionLabel} opt={true} base={indemniteSujetion} /> <LigneSalaire type="brut" label={indemniteSujetionLabel} opt={true} base={indemniteSujetion} />
<LigneSalaire type="brut" label="Logé / Nourri" opt={true} base={primeLogeNourri} /> <LigneSalaire type="brut" label="Logé / Nourri" opt={true} base={primeLogeNourri} />
<LigneSalaire type="brut" label="Prime de responsabilité SASPAS" opt={true} base={primeSASPAS} /> <LigneSalaire type="brut" label="Prime de responsabilité SASPAS" opt={true} base={primeSASPAS} />
<LigneSalaire type="brut" label="Indemnité de transport > 15 km" opt={true} base={indemniteTransport} /> <LigneSalaire
<LigneSalaire type="brut" label="Indemnité d'hébergement (ZIP/ZAC)" opt={true} base={indemniteHebergement} /> type="brut"
label="Indemnité de transport > 15 km"
opt={true}
base={indemniteTransport}
/>
<LigneSalaire
type="brut"
label="Indemnité d'hébergement (ZIP/ZAC)"
opt={true}
base={indemniteHebergement}
/>
<LigneSalaire type="nombre" label="Demi-garde" opt={true} base={valDemiGarde} nombre={nbDemiGardes} /> <LigneSalaire
<LigneSalaire type="nombre" label="Garde de semaine (12h)" opt={true} base={valGardeSem} nombre={nbGardesSem} /> type="nombre"
<LigneSalaire type="nombre" label="Garde de week-end (12h)" opt={true} base={valGardeWE} nombre={nbGardesWE} /> label="Demi-garde"
<LigneSalaire type="nombre" label="Astreinte" opt={true} base={valAstreinte} nombre={nbAstreintes} /> opt={true}
<LigneSalaire type="nombre" label="Déplacement sur astreinte" opt={true} base={valDeplacement} nombre={nbDeplacements} /> base={valDemiGarde}
nombre={nbDemiGardes}
/>
<LigneSalaire
type="nombre"
label="Garde de semaine (12h)"
opt={true}
base={valGardeSem}
nombre={nbGardesSem}
/>
<LigneSalaire
type="nombre"
label="Garde de week-end (12h)"
opt={true}
base={valGardeWE}
nombre={nbGardesWE}
/>
<LigneSalaire
type="nombre"
label="Astreinte"
opt={true}
base={valAstreinte}
nombre={nbAstreintes}
/>
<LigneSalaire
type="nombre"
label="Déplacement sur astreinte"
opt={true}
base={valDeplacement}
nombre={nbDeplacements}
/>
<div class="grow flex bg-surface-600 px-1 font-bold"> <div class="grow flex bg-surface-600 px-1 font-bold">
<div class="grow text-left">&nbsp;TOTAL BRUT</div> <div class="grow text-left">&nbsp;TOTAL BRUT</div>
@ -259,12 +306,33 @@ $: if (isNourri) {
</div> </div>
<LigneSalaire type="taux" label="CSG déductible" base={baseCsgRds} taux={-tauxCSGDeductible} /> <LigneSalaire type="taux" label="CSG déductible" base={baseCsgRds} taux={-tauxCSGDeductible} />
<LigneSalaire type="taux" label="CSG non déductible" base={baseCsgRds} taux={-tauxCSGNonDeductible} /> <LigneSalaire
type="taux"
label="CSG non déductible"
base={baseCsgRds}
taux={-tauxCSGNonDeductible}
/>
<LigneSalaire type="taux" label="C(RDS)" base={baseCsgRds} taux={-tauxCRDS} /> <LigneSalaire type="taux" label="C(RDS)" base={baseCsgRds} taux={-tauxCRDS} />
<LigneSalaire type="taux" label="IRCANTEC tranche A" base={baseIrcantecA} taux={-tauxIrcantecA} /> <LigneSalaire type="taux" label="IRCANTEC tranche A" base={baseIrcantecA} taux={-tauxIrcantecA} />
<LigneSalaire type="taux" label="IRCANTEC tranche B" opt={true} base={baseIrcantecB} taux={-tauxIrcantecB} /> <LigneSalaire
<LigneSalaire type="taux" label="S.S Vieillesse déplafonnée" base={baseRetraite} taux={-tauxVieillesseDeplafonee} /> type="taux"
<LigneSalaire type="taux" label="S.S Vieillesse plafonnée" base={basePlafonnee} taux={-tauxVieillessePlafonee} /> label="IRCANTEC tranche B"
opt={true}
base={baseIrcantecB}
taux={-tauxIrcantecB}
/>
<LigneSalaire
type="taux"
label="S.S Vieillesse déplafonnée"
base={baseRetraite}
taux={-tauxVieillesseDeplafonee}
/>
<LigneSalaire
type="taux"
label="S.S Vieillesse plafonnée"
base={basePlafonnee}
taux={-tauxVieillessePlafonee}
/>
{#if tauxSource} {#if tauxSource}
<div class="grow flex bg-surface-600 px-1 font-bold"> <div class="grow flex bg-surface-600 px-1 font-bold">
@ -273,7 +341,13 @@ $: if (isNourri) {
</div> </div>
{/if} {/if}
<LigneSalaire type="taux" label="Prélèvement à la source" opt={true} base={totalNetFiscal} taux={-tauxSource} /> <LigneSalaire
type="taux"
label="Prélèvement à la source"
opt={true}
base={totalNetFiscal}
taux={-tauxSource}
/>
<div class="grow flex bg-surface-600 px-1 font-bold"> <div class="grow flex bg-surface-600 px-1 font-bold">
<div class="grow text-left">&nbsp;TOTAL NET</div> <div class="grow text-left">&nbsp;TOTAL NET</div>