Last active
April 29, 2023 21:39
-
-
Save Salamandar/a49c82ac5916f4519cf689d43263e29a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import yargs from 'yargs' | |
import Engine, { formatValue } from 'publicodes' | |
import rules from 'modele-social' | |
// npm install publicodes modele-social yargs | |
// node ./modele.mjs --salaireBrut 2500 2>/dev/null | jq | |
// Définition des arguments en ligne de commande avec yargs | |
const argv = yargs(process.argv.slice(2)) | |
.usage('Utilisation: node app.js --salaireBrut <valeur> XOR --coutTotalEmployeur <valeur>') | |
.option('salaireBrut', { | |
describe: 'Le salaire brut de la personne', | |
type: 'number' | |
}) | |
.option('coutTotalEmployeur', { | |
describe: 'Le coût total employeur', | |
type: 'number' | |
}) | |
.conflicts('salaireBrut', 'coutTotalEmployeur') | |
.argv; | |
if (!argv.salaireBrut && !argv.coutTotalEmployeur) { | |
console.error('Veuillez spécifier l\'un des deux arguments --salaireBrut ou --coutTotalEmployeur.') | |
process.exit(1) | |
} | |
function get_situation_dict(brut, cout_employeur) { | |
const situation_base = { | |
'salarié . cotisations . prévoyances . santé . montant': '0€/mois', | |
'salarié . rémunération . frais professionnels . trajets domicile travail . transports publics . montant': '0€/mois', | |
'salarié . rémunération . frais professionnels . trajets domicile travail . forfait mobilités durables . montant': '0€/mois', | |
'salarié . rémunération . frais professionnels . trajets domicile travail . prime de transport . montant': '0€/mois', | |
'salarié . cotisations . maladie . employeur . taux réduit': 'non', | |
'salarié . cotisations . allocations familiales . taux réduit': 'non', | |
'salarié . cotisations . ATMP . taux': '0.75%', | |
} | |
let situation_arg = {}; | |
if (brut) { | |
situation_arg = {'salarié . rémunération . brut': `${brut}€/mois`} | |
} else if (cout_employeur) { | |
situation_arg = {'salarié . coût total employeur': `${cout_employeur}€/mois`} | |
} else { | |
throw new Error("brut et cout employeur sont null tous les deux!") | |
} | |
return {...situation_base, ...situation_arg} | |
} | |
function _evaluate(situation, value) { | |
return situation.evaluate(value).nodeValue | |
} | |
let resultat = {} | |
// Set the situation... | |
let brut = argv.salaireBrut | |
let cout_employeur = argv.coutTotalEmployeur | |
const engine = new Engine(rules) | |
let situation = engine.setSituation(get_situation_dict(brut, cout_employeur)) | |
// If given value is cout total employeur, we need to compute manually brut then re-set the situation | |
if (argv.coutTotalEmployeur) { | |
// compute brut... | |
brut = undefined | |
situation = engine.setSituation(get_situation_dict(brut, null)) | |
} else { | |
// compute cout total employeur | |
const sante = _evaluate(situation, 'salarié . cotisations . maladie . employeur') | |
const atmp = _evaluate(situation, 'salarié . cotisations . ATMP') | |
const retraite = _evaluate(situation, 'salarié . cotisations . vieillesse . employeur') | |
const famille = _evaluate(situation, 'salarié . cotisations . allocations familiales') | |
const chomage = _evaluate(situation, 'salarié . cotisations . chômage . employeur') | |
// FIXME: How to ? | |
const autres = 0.416/100*brut | |
const total_cotisations_patronales = sante + atmp + retraite + famille + chomage + autres | |
resultat["Cotisations patronales totales"] = total_cotisations_patronales | |
resultat["Cotisations patronales"] = { | |
"Santé": sante, | |
"ATMP": atmp, | |
"Retraite": retraite, | |
"Famille": famille, | |
"Chômage": chomage, | |
"Autres": autres | |
} | |
cout_employeur = brut + total_cotisations_patronales | |
} | |
resultat["Coût total employeur"] = cout_employeur | |
resultat["Salaire brut"] = brut | |
// Now compute net | |
const taux_pas = 5.2 | |
const retraite = _evaluate(situation, 'salarié . cotisations . vieillesse . salarié') | |
const csg_rds = _evaluate(situation, 'salarié . cotisations . CSG-CRDS') | |
const csg_non_deductible = _evaluate(situation, 'salarié . cotisations . CSG-CRDS . non déductible') | |
const net = brut - retraite - csg_rds | |
const imposable = net + csg_non_deductible | |
const pas = imposable / 100 * taux_pas | |
const net_apres_pas = net - pas | |
resultat["Cotisations salariales"] = { | |
"Retraite": retraite, | |
"CSG-CRDS": csg_rds, | |
} | |
resultat["Salaire Net"] = net | |
resultat["Salaire Imposable"] = imposable | |
resultat["Salaire Net versé"] = net_apres_pas | |
resultat["Coût total CAE avec contribution"] = cout_employeur / 0.89 | |
console.log(JSON.stringify(resultat)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment