salaire : application fonctionnelle
This commit is contained in:
parent
c5a1b0e390
commit
1d0fbf3d40
|
|
@ -1,71 +1,16 @@
|
||||||
<!-- YOU CAN DELETE EVERYTHING IN THIS PAGE -->
|
<script>
|
||||||
|
import SalaireInterne from "./SalaireInterne.svelte";
|
||||||
|
</script>
|
||||||
|
|
||||||
<div class="container h-full mx-auto flex justify-center items-center">
|
<div class="container h-full mx-auto flex justify-center items-center max-w-6xl">
|
||||||
<div class="space-y-10 text-center flex flex-col items-center">
|
<div class="flex space-y-10 items-center grid grid-cols-1">
|
||||||
<h2 class="h2">Welcome to Skeleton.</h2>
|
<div>
|
||||||
<!-- Animated Logo -->
|
<h2 class="h2">Salaire d'interne v2</h2>
|
||||||
<figure>
|
|
||||||
<section class="img-bg" />
|
|
||||||
<svg
|
|
||||||
class="fill-token -scale-x-[100%]"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 200 200"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M98.77 50.95c25.1 0 46.54 8.7 61.86 23a41.34 41.34 0 0 0 5.19-1.93c4.35-2.02 10.06-6.17 17.13-12.43-1.15 10.91-2.38 18.93-3.7 24.04-.7 2.75-1.8 6.08-3.3 10a80.04 80.04 0 0 1 8.42 23.33c6.04 30.3-4.3 43.7-28.33 51.18.18.9.32 1.87.42 2.9.86 8.87-3.62 23.19-9 23.19-3.54 0-5.84-4.93-8.3-12.13-.78 8.34-4.58 17.9-8.98 17.9-4.73 0-7.25-8.84-10.93-20.13a214 214 0 0 1-.64 2.93l-.16.71-.16.71-.17.71c-1.84 7.58-4.46 15.07-8.5 15.07-5.06 0-2.29-15.9-10.8-22.63-43.14 2.36-79.43-13.6-79.43-59.62 0-8.48 2-16.76 5.69-24.45a93.72 93.72 0 0 1-1.77-3.68c-2.87-6.32-6.3-15.88-10.31-28.7 10.26 7.66 18.12 12.22 23.6 13.68.5.14 1.02.26 1.57.36 14.36-14.44 35.88-24.01 60.6-24.01Zm-9.99 62.3c-14.57 0-26.39 11.45-26.39 25.58 0 14.14 11.82 25.6 26.39 25.6s26.39-11.46 26.39-25.6c0-13.99-11.58-25.35-25.95-25.58Zm37.45 31.95c-4.4 0-6.73 9.4-6.73 13.62 0 3.3 1.1 5.12 2.9 5.45 4.39.4 3.05-5.97 5.23-5.97 1.06 0 2.2 1.35 3.34 2.73l.34.42c1.25 1.52 2.5 2.93 3.64 2.49 2.7-1.61 1.67-5.12.74-7.88-3.3-6.96-5.05-10.86-9.46-10.86Zm-36.85-28.45c12.57 0 22.76 9.78 22.76 21.85 0 12.07-10.2 21.85-22.76 21.85-.77 0-1.53-.04-2.29-.11 11.5-1.1 20.46-10.42 20.46-21.74 0-11.32-8.97-20.63-20.46-21.74.76-.07 1.52-.1 2.3-.1Zm65.54-5c-10.04 0-18.18 10.06-18.18 22.47 0 12.4 8.14 22.47 18.18 22.47s18.18-10.06 18.18-22.47c0-12.41-8.14-22.48-18.18-22.48Zm.6 3.62c8.38 0 15.16 8.4 15.16 18.74 0 10.35-6.78 18.74-15.16 18.74-.77 0-1.54-.07-2.28-.21 7.3-1.36 12.89-9.14 12.89-18.53 0-9.4-5.6-17.17-12.89-18.53.74-.14 1.5-.2 2.28-.2Zm3.34-72.27.12.07c.58.38.75 1.16.37 1.74l-2.99 4.6c-.35.55-1.05.73-1.61.44l-.12-.07a1.26 1.26 0 0 1-.37-1.74l2.98-4.6a1.26 1.26 0 0 1 1.62-.44ZM39.66 42l.08.1 2.76 3.93a1.26 1.26 0 0 1-2.06 1.45l-2.76-3.94A1.26 1.26 0 0 1 39.66 42Zm63.28-42 2.85 24.13 10.62-11.94.28 29.72-2.1-.47a77.8 77.8 0 0 0-16.72-2.04c-4.96 0-9.61.67-13.96 2l-2.34.73L83.5 4.96l9.72 18.37L102.94 0Zm-1.87 13.39-7.5 17.96-7.3-13.8-1.03 19.93.22-.06a51.56 51.56 0 0 1 12.1-1.45h.31c4.58 0 9.58.54 15 1.61l.35.07-.15-16.54-9.79 11-2.21-18.72Zm38.86 19.23c.67.2 1.05.89.86 1.56l-.38 1.32c-.17.62-.8 1-1.42.89l-.13-.03a1.26 1.26 0 0 1-.86-1.56l.38-1.32c.19-.66.88-1.05 1.55-.86ZM63.95 31.1l.05.12.7 2.17a1.26 1.26 0 0 1-2.34.9l-.04-.12-.71-2.17a1.26 1.26 0 0 1 2.34-.9Z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</figure>
|
|
||||||
<!-- / -->
|
|
||||||
<div class="flex justify-center space-x-2">
|
|
||||||
<a
|
|
||||||
class="btn variant-filled"
|
|
||||||
href="https://skeleton.dev/"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
Launch Documentation 2
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="space-y-2">
|
|
||||||
<p>Try editing the following:</p>
|
|
||||||
<p><code class="code">/src/routes/+layout.svelte</code></p>
|
|
||||||
<p><code class="code">/src/routes/+page.svelte</code></p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<SalaireInterne />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style lang="postcss">
|
<style lang="postcss">
|
||||||
figure {
|
|
||||||
@apply flex relative flex-col;
|
|
||||||
}
|
|
||||||
figure svg,
|
|
||||||
.img-bg {
|
|
||||||
@apply w-64 h-64 md:w-80 md:h-80;
|
|
||||||
}
|
|
||||||
.img-bg {
|
|
||||||
@apply absolute z-[-1] rounded-full blur-[50px] transition-all;
|
|
||||||
animation: pulse 5s cubic-bezier(0, 0, 0, 0.5) infinite,
|
|
||||||
glow 5s linear infinite;
|
|
||||||
}
|
|
||||||
@keyframes glow {
|
|
||||||
0% {
|
|
||||||
@apply bg-primary-400/50;
|
|
||||||
}
|
|
||||||
33% {
|
|
||||||
@apply bg-secondary-400/50;
|
|
||||||
}
|
|
||||||
66% {
|
|
||||||
@apply bg-tertiary-400/50;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
@apply bg-primary-400/50;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@keyframes pulse {
|
|
||||||
50% {
|
|
||||||
transform: scale(1.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
<script lang="ts">
|
||||||
|
export let opt : boolean = false;
|
||||||
|
export let type : string;
|
||||||
|
|
||||||
|
export let label : string;
|
||||||
|
export let taux : number = 0;
|
||||||
|
export let nombre : number = 0;
|
||||||
|
export let base : number = 0;
|
||||||
|
|
||||||
|
let afficher: boolean = false;
|
||||||
|
let valeur: number = 0;
|
||||||
|
|
||||||
|
$: if (type === "taux") {
|
||||||
|
valeur = (taux * base) / 100;
|
||||||
|
} else if (type === "nombre") {
|
||||||
|
valeur = nombre * base;
|
||||||
|
} else if (type === "brut") {
|
||||||
|
valeur = base;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if valeur || !opt}
|
||||||
|
<div class="grow flex text-right px-1">
|
||||||
|
<div class="grow text-left">{label}</div>
|
||||||
|
{#if (type === "taux" || type === "nombre")}
|
||||||
|
<div class="flex-none w-24">{base.toFixed(2)}</div>
|
||||||
|
<div class="flex-none w-16">{(type === "taux") ? taux.toFixed(2) : nombre}</div>
|
||||||
|
{/if}
|
||||||
|
<div class="flex-none w-24">{valeur.toFixed(2)}</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<script lang="ts">
|
||||||
|
export let compteur: number = 0;
|
||||||
|
|
||||||
|
function incrementer() {
|
||||||
|
compteur += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function decrementer() {
|
||||||
|
if (compteur > 0) {
|
||||||
|
compteur -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="flex flex-col-reverse xl:flex-row items-center justify-left gap-2">
|
||||||
|
<div class="btn-group variant-ringed shrink-0 [&>*]:btn-sm">
|
||||||
|
<button class="btn-icon" on:click={decrementer}>-</button>
|
||||||
|
<button class="btn variant-filled-surface pointer-events-none">{compteur}</button>
|
||||||
|
<button class="btn-icon" on:click={incrementer}>+</button>
|
||||||
|
</div>
|
||||||
|
<span class="grow"><slot /></span>
|
||||||
|
</div>
|
||||||
|
|
@ -0,0 +1,285 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { RadioGroup, RadioItem, SlideToggle } from '@skeletonlabs/skeleton';
|
||||||
|
import PlusMoins from './PlusMoins.svelte';
|
||||||
|
import { recupBasesLegales } from './basesLegales';
|
||||||
|
import LigneSalaire from './LigneSalaire.svelte';
|
||||||
|
|
||||||
|
let anneeInternat: string = '1re';
|
||||||
|
let isLogé: boolean = false;
|
||||||
|
let isNourri: boolean = true;
|
||||||
|
let medGeOuSpe: string = "spe";
|
||||||
|
let aPrimeSaspas: boolean = false;
|
||||||
|
let aIndemnite15km: boolean = false;
|
||||||
|
let aIndemniteZipZac: boolean = false;
|
||||||
|
let estUltramarin: boolean = false;
|
||||||
|
|
||||||
|
let nbDemiGardes: number = 0;
|
||||||
|
let nbGardesSem : number = 0;
|
||||||
|
let nbGardesWE : number = 0;
|
||||||
|
let nbAstreintes : number = 0;
|
||||||
|
let nbDeplacements: number = 0;
|
||||||
|
|
||||||
|
const annees = ['FFI', '1re', '2e', '3e', '4e', '5e', 'DJ1', 'DJ2'];
|
||||||
|
const bases = recupBasesLegales(2023, 10);
|
||||||
|
|
||||||
|
// Salaire de base et idemnités
|
||||||
|
let base : number = 0;
|
||||||
|
let indemniteSujetion : number = 0;
|
||||||
|
let indemniteSujetionLabel : string = "";
|
||||||
|
let indemniteSujetionRetraite : number = 0;
|
||||||
|
|
||||||
|
$: switch(anneeInternat) {
|
||||||
|
case "FFI":
|
||||||
|
base = parseFloat(bases.baseFFI) / 12;
|
||||||
|
indemniteSujetion = parseFloat(bases.indemniteSujetion);
|
||||||
|
indemniteSujetionLabel = "Indemnité de sujetion";
|
||||||
|
indemniteSujetionRetraite = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "1re":
|
||||||
|
base = parseFloat(bases.base1ere) / 12;
|
||||||
|
indemniteSujetion = parseFloat(bases.indemniteSujetion);
|
||||||
|
indemniteSujetionLabel = "Indemnité de sujetion";
|
||||||
|
indemniteSujetionRetraite = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2e":
|
||||||
|
base = parseFloat(bases.base2e) / 12;
|
||||||
|
indemniteSujetion = parseFloat(bases.indemniteSujetion);
|
||||||
|
indemniteSujetionLabel = "Indemnité de sujetion";
|
||||||
|
indemniteSujetionRetraite = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "3e":
|
||||||
|
base = parseFloat(bases.base3e) / 12;
|
||||||
|
indemniteSujetion = 0;
|
||||||
|
indemniteSujetionLabel = "";
|
||||||
|
indemniteSujetionRetraite = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "4e":
|
||||||
|
base = parseFloat(bases.base4e) / 12;
|
||||||
|
indemniteSujetion = parseFloat(bases.primeResp4eme) / 12;
|
||||||
|
indemniteSujetionLabel = "Prime de responsabilité";
|
||||||
|
indemniteSujetionRetraite = indemniteSujetion;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "5e":
|
||||||
|
base = parseFloat(bases.base5e) / 12;
|
||||||
|
indemniteSujetion = parseFloat(bases.primeResp5eme) / 12;
|
||||||
|
indemniteSujetionLabel = "Prime de responsabilité";
|
||||||
|
indemniteSujetionRetraite = indemniteSujetion;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "DJ1":
|
||||||
|
base = parseFloat(bases.baseDJ1) / 12;
|
||||||
|
indemniteSujetion = parseFloat(bases.primeDJ1re) / 12;
|
||||||
|
indemniteSujetionLabel = "Prime d'autonomie supervisée";
|
||||||
|
indemniteSujetionRetraite = indemniteSujetion;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "DJ2":
|
||||||
|
base = parseFloat(bases.baseDJ2) / 12;
|
||||||
|
indemniteSujetion = parseFloat(bases.primeDJ2eme) / 12;
|
||||||
|
indemniteSujetionLabel = "Prime d'autonomie supervisée";
|
||||||
|
indemniteSujetionRetraite = indemniteSujetion;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.error("Année d'internat mal choisie");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prime logé - nourri
|
||||||
|
let primeLogeNourri : number = 0;
|
||||||
|
$: if (isNourri) {
|
||||||
|
if (isLogé) {
|
||||||
|
primeLogeNourri = parseFloat(bases.primeNonLogeNonNourri) / 12;
|
||||||
|
} else {
|
||||||
|
primeLogeNourri = parseFloat(bases.primeLogeNonNourri) / 12;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isLogé) {
|
||||||
|
primeLogeNourri = parseFloat(bases.primeNonLogeNourri) / 12;
|
||||||
|
} else {
|
||||||
|
primeLogeNourri = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prime SASPAS et indemnité transport et indemnité d'hébergement
|
||||||
|
$: primeSASPAS = (medGeOuSpe === "mg") && aPrimeSaspas ? parseFloat(bases.primeSASPAS) : 0;
|
||||||
|
$: indemniteTransport = (medGeOuSpe === "mg") && aIndemnite15km ? parseFloat(bases.indemniteDeplacement) : 0;
|
||||||
|
$: indemniteHebergement = (medGeOuSpe === "mg") && aIndemniteZipZac ? parseFloat(bases.indemniteHebergement) : 0;
|
||||||
|
|
||||||
|
// Prime Outremer
|
||||||
|
$: tauxPrimeOutremer = estUltramarin ? parseFloat(bases.tauxPrimeOutremer) : 0;
|
||||||
|
|
||||||
|
// Gardes et astreintes
|
||||||
|
$: valDemiGarde = parseFloat(bases.demigarde);
|
||||||
|
$: valGardeSem = parseFloat(bases.gardeSem); // Pas de gestion des gardes au dela du service normal pour le moment
|
||||||
|
$: valGardeWE = parseFloat(bases.gardeWE); // Pas de gestion des gardes au dela du service normal pour le moment
|
||||||
|
$: valAstreinte = parseFloat(bases.astreinte);
|
||||||
|
$: valDeplacement = parseFloat(bases.deplaAstreinte);
|
||||||
|
|
||||||
|
// == TOTAL BRUT ==
|
||||||
|
$: totalBrut = base
|
||||||
|
+ indemniteSujetion
|
||||||
|
+ primeLogeNourri
|
||||||
|
+ primeSASPAS
|
||||||
|
+ indemniteTransport
|
||||||
|
+ indemniteHebergement
|
||||||
|
+ tauxPrimeOutremer * base / 100
|
||||||
|
+ nbDemiGardes * valDemiGarde
|
||||||
|
+ nbGardesSem * valGardeSem
|
||||||
|
+ nbGardesWE * valGardeWE
|
||||||
|
+ nbAstreintes * valAstreinte
|
||||||
|
+ nbDeplacements * valDeplacement;
|
||||||
|
|
||||||
|
// Contribution sociale généralisée (CSG) et remboursement de la dette sociale (CRDS)
|
||||||
|
$: baseCsgRds = totalBrut * parseFloat(bases.assietteCSGCRDS);
|
||||||
|
$: tauxCSGDeductible = parseFloat(bases.tauxCSGDeductible);
|
||||||
|
$: tauxCSGNonDeductible = parseFloat(bases.tauxCSGNonDeductible);
|
||||||
|
$: tauxCRDS = parseFloat(bases.tauxCRDS);
|
||||||
|
|
||||||
|
// Retraite IRCANTEC
|
||||||
|
$: baseRetraite = (base + indemniteSujetionRetraite + indemniteTransport + indemniteHebergement + primeSASPAS) * 2/3;
|
||||||
|
$: plafondSS = parseFloat(bases.plafondSS);
|
||||||
|
$: baseIrcantecA = (baseRetraite > plafondSS) ? plafondSS : baseRetraite;
|
||||||
|
$: baseIrcantecB = (baseRetraite > plafondSS) ? baseRetraite - plafondSS : 0;
|
||||||
|
|
||||||
|
$: tauxIrcantecA = parseFloat(bases.IRCANTECTrA);
|
||||||
|
$: tauxIrcantecB = parseFloat(bases.IRCANTECTrB);
|
||||||
|
|
||||||
|
// Sécurité sociale
|
||||||
|
$: basePlafonnee = (totalBrut > plafondSS) ? plafondSS : totalBrut;
|
||||||
|
$: tauxVieillessePlafonee = parseFloat(bases.tauxAssuranceViellessePlafonee);
|
||||||
|
$: tauxVieillesseDeplafonee = parseFloat(bases.tauxAssuranceViellesseDeplaf);
|
||||||
|
|
||||||
|
// == TOTAL NET AVANT IMPOTS ==
|
||||||
|
$: totalNetFiscal = totalBrut
|
||||||
|
- baseCsgRds * tauxCSGDeductible / 100
|
||||||
|
- baseIrcantecA * tauxIrcantecA / 100
|
||||||
|
- baseIrcantecB * tauxIrcantecB / 100
|
||||||
|
- totalBrut * tauxVieillesseDeplafonee / 100
|
||||||
|
- basePlafonnee * tauxVieillessePlafonee / 100;
|
||||||
|
$: totalNetAvantImpots = totalNetFiscal
|
||||||
|
- baseCsgRds * tauxCSGNonDeductible / 100
|
||||||
|
- baseCsgRds * tauxCRDS / 100;
|
||||||
|
|
||||||
|
// Impots à la source
|
||||||
|
let tauxSource : number = 0;
|
||||||
|
$: totalNet = totalNetAvantImpots - (totalNetFiscal * tauxSource / 100);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{@debug base, totalBrut, totalNet}
|
||||||
|
|
||||||
|
<!-- ENTREES -->
|
||||||
|
<div class="grid gap-3 grid-cols-5 items-center">
|
||||||
|
<div>
|
||||||
|
<label class="label" for="dateSalaire"><span>Date d'effet</span></label>
|
||||||
|
<input id="dateSalaire" value="Date" disabled/>
|
||||||
|
</div>
|
||||||
|
<div class="col-span-3 overflow-x-auto flex">
|
||||||
|
<div class="grow" />
|
||||||
|
<div class="text-center">
|
||||||
|
<label class="label text-left pl-3" for="anneeInternat"><span>Année</span></label>
|
||||||
|
<RadioGroup id="anneeInternat">
|
||||||
|
{#each annees as a}
|
||||||
|
<RadioItem bind:group={anneeInternat} name="anneeInternat" value={a}>{a}</RadioItem>
|
||||||
|
{/each}
|
||||||
|
</RadioGroup>
|
||||||
|
</div>
|
||||||
|
<div class="grow" />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-1">
|
||||||
|
<SlideToggle name="slider-logé" bind:checked={isLogé}>Logé</SlideToggle>
|
||||||
|
<SlideToggle name="slider-nourri" bind:checked={isNourri}>Nourri</SlideToggle>
|
||||||
|
</div>
|
||||||
|
<div class="col-span-2 flex flex-col gap-1">
|
||||||
|
<div class="grow pb-2 flex justify-left">
|
||||||
|
<RadioGroup id="medGeOuSpe">
|
||||||
|
<RadioItem bind:group={medGeOuSpe} name="medGeOuSpe" value="mg">Med Gé</RadioItem>
|
||||||
|
<RadioItem bind:group={medGeOuSpe} name="medGeOuSpe" value="spe">Spé</RadioItem>
|
||||||
|
</RadioGroup>
|
||||||
|
</div>
|
||||||
|
<div class:invisible={medGeOuSpe === "spe"} class="flex justify-left pl-3">
|
||||||
|
<SlideToggle name="slider-saspas" bind:checked={aPrimeSaspas}>SASPAS</SlideToggle>
|
||||||
|
</div>
|
||||||
|
<div class:invisible={medGeOuSpe === "spe"} class="flex justify-left pl-3">
|
||||||
|
<SlideToggle name="slider-15km" bind:checked={aIndemnite15km}>Stage > 15 km</SlideToggle>
|
||||||
|
</div>
|
||||||
|
<div class:invisible={medGeOuSpe === "spe"} class="flex justify-left pl-3">
|
||||||
|
<SlideToggle name="slider-zipzac" bind:checked={aIndemniteZipZac}>Indemnité hébergement</SlideToggle>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<SlideToggle name="slider-outremer" bind:checked={estUltramarin}>Outremer</SlideToggle>
|
||||||
|
<PlusMoins bind:compteur={nbDemiGardes}>Demi-gardes</PlusMoins>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<PlusMoins bind:compteur={nbGardesSem}>Gardes semaine</PlusMoins>
|
||||||
|
<PlusMoins bind:compteur={nbGardesWE}>Gardes WE & JF (12h)</PlusMoins>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<PlusMoins bind:compteur={nbAstreintes}>Astreintes (12h)</PlusMoins>
|
||||||
|
<PlusMoins bind:compteur={nbDeplacements}>Déplacements</PlusMoins>
|
||||||
|
</div>
|
||||||
|
<div class="col-span-5 flex flex-col md:flex-row">
|
||||||
|
<span>Taux de prélèvement à la source : {tauxSource} %</span>
|
||||||
|
<input type="range" bind:value={tauxSource} max="20" step="0.5"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- BULLETIN DE SALAIRE -->
|
||||||
|
<div class="ficheSalaire flex flex-col bg-surface-700 font-mono">
|
||||||
|
<div class="grow flex text-center bg-surface-600 px-1 font-bold">
|
||||||
|
<div class="grow text-left"> Description</div>
|
||||||
|
<div class="flex-none w-24">Base</div>
|
||||||
|
<div class="flex-none w-16">Nb/Taux</div>
|
||||||
|
<div class="flex-none w-24">Total</div>
|
||||||
|
</div>
|
||||||
|
<LigneSalaire type="brut" label="Traitement de base" base={base} />
|
||||||
|
|
||||||
|
<LigneSalaire type="taux" label="Prime outremer" opt={true} base={base} taux={tauxPrimeOutremer} />
|
||||||
|
<LigneSalaire type="brut" label={indemniteSujetionLabel} opt={true} base={indemniteSujetion} />
|
||||||
|
<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="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 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 text-left"> TOTAL BRUT</div>
|
||||||
|
<div class="flex-none w-24 text-right">{totalBrut.toFixed(2)}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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="C(RDS)" base={baseCsgRds} taux={-tauxCRDS} />
|
||||||
|
<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 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}
|
||||||
|
<div class="grow flex bg-surface-600 px-1 font-bold">
|
||||||
|
<div class="grow text-left"> TOTAL NET AVANT IMPOTS</div>
|
||||||
|
<div class="flex-none w-24 text-right">{totalNetAvantImpots.toFixed(2)}</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<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 text-left"> TOTAL NET</div>
|
||||||
|
<div class="flex-none w-24 text-right">{totalNet.toFixed(2)}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
export function recupBasesLegales(annee: number, mois: number) {
|
||||||
|
const base = {
|
||||||
|
/* Salaires de bases :
|
||||||
|
A partir de juillet 2023 - https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000047774474
|
||||||
|
A partir de juillet 2022 - https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000046032166/2022-07-11
|
||||||
|
De nov 2020 à juin 2022 - https://www.legifrance.gouv.fr/loda/id/LEGIARTI000042352097/2020-11-01/#LEGIARTI000042352097
|
||||||
|
De fev 2017 à oct 2020 - https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000042352732/2020-11-01
|
||||||
|
|
||||||
|
Gardes > 2020 :
|
||||||
|
*/
|
||||||
|
"baseDJ2": "28495.49",
|
||||||
|
"baseDJ1": "28495.49",
|
||||||
|
"base5e": "28448.22",
|
||||||
|
"base4e": "28430.36",
|
||||||
|
"base3e": "28408.30",
|
||||||
|
"base2e": "21483.24",
|
||||||
|
"base1ere": "19406.35",
|
||||||
|
"baseFFI": "17745.47",
|
||||||
|
"baseAnneeRecherche": "25931.90",
|
||||||
|
"indemniteSujetion": "435.18",
|
||||||
|
"primeDJ2eme": "6000",
|
||||||
|
"primeDJ1re": "5000", // https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000041582655
|
||||||
|
"primeResp5eme": "4273.93",
|
||||||
|
"primeResp4eme": "2154.10",
|
||||||
|
"primeNonLogeNonNourri": "1010.64",
|
||||||
|
"primeNonLogeNourri": "336.32",
|
||||||
|
"primeLogeNonNourri": "674.31",
|
||||||
|
"primeSASPAS": "125",
|
||||||
|
"indemniteDeplacement": "130",
|
||||||
|
"indemniteHebergement": "150",
|
||||||
|
"tauxPrimeOutremer": "40",
|
||||||
|
|
||||||
|
"gardeSem": "156.53",
|
||||||
|
"gardeWE": "171.24",
|
||||||
|
"demigarde": "78.26",
|
||||||
|
"astreinte": "21.26",
|
||||||
|
"deplaAstreinte": "78.26",
|
||||||
|
|
||||||
|
"tauxCSGDeductible": "6.8", // janvier 2019
|
||||||
|
"tauxCSGNonDeductible": "2.40", // janvier 2019
|
||||||
|
"tauxCRDS": "0.50", // février 1996
|
||||||
|
"assietteCSGCRDS": "0.9825",
|
||||||
|
|
||||||
|
// Retraite : https://www.ircantec.retraites.fr/employeur/parametres-utilises-ircantec
|
||||||
|
"IRCANTECTrA": "2.8",
|
||||||
|
"IRCANTECTrB": "6.95",
|
||||||
|
"plafondSS": "3666",
|
||||||
|
"tauxAssuranceViellessePlafonee": "6.9",
|
||||||
|
"tauxAssuranceViellesseDeplaf": "0.4",
|
||||||
|
}
|
||||||
|
return base;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue