Skip to content

Instantly share code, notes, and snippets.

@Salamandar
Last active April 29, 2023 21:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Salamandar/a49c82ac5916f4519cf689d43263e29a to your computer and use it in GitHub Desktop.
Save Salamandar/a49c82ac5916f4519cf689d43263e29a to your computer and use it in GitHub Desktop.
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