Skip to content
Snippets Groups Projects
Commit 87d339b6 authored by Loïc Poullain's avatar Loïc Poullain
Browse files

Add ir/ and dotations/ subdirs in parameters/

parent a3065745
No related branches found
No related tags found
1 merge request!53[DSR] Connecter l'état redux à l'UI & envoyer la requête au serveur lorsqu'on clique sur "simuler"
Showing
with 449 additions and 192 deletions
import { cloneDeep } from "lodash";
// eslint-disable-next-line no-unused-vars
import { ResetAmendementToBaseAction, ResetAmendementToPlfAction } from "../../../actions";
import { BASE_DOTATIONS_DEFAULT_STATE } from "../base";
// eslint-disable-next-line no-unused-vars
import { DotationsState } from "../interfaces";
import { PLF_DOTATIONS_DEFAULT_STATE } from "../plf";
const AMENDEMENT_DOTATIONS_DEFAULT_STATE = cloneDeep(PLF_DOTATIONS_DEFAULT_STATE);
type DotationsAction = ResetAmendementToBaseAction|ResetAmendementToPlfAction;
export function dotations(
state: DotationsState = AMENDEMENT_DOTATIONS_DEFAULT_STATE, action: DotationsAction,
): DotationsState {
switch (action.type) {
case "RESET_AMENDEMENT_TO_PLF":
if (action.topic === "dotations") {
return cloneDeep(PLF_DOTATIONS_DEFAULT_STATE);
}
return state;
case "RESET_AMENDEMENT_TO_BASE":
if (action.topic === "dotations") {
return cloneDeep(BASE_DOTATIONS_DEFAULT_STATE);
}
return state;
default:
return state;
}
}
import { getIn, setIn } from "immutable";
import { combineReducers } from "redux";
import {
// eslint-disable-next-line no-unused-vars
AddNewLineInParameterArrayAction,
// eslint-disable-next-line no-unused-vars
RemoveLastLineInParameterArrayAction,
// eslint-disable-next-line no-unused-vars
UpdateParameterAction,
} from "../../../actions";
// eslint-disable-next-line no-unused-vars
import { ParametersState } from "../interfaces";
import { dotations } from "./dotations";
import { ir } from "./ir";
const updateParameter = (state: ParametersState, path: string, value: any): ParametersState => setIn(state, path.split("."), value);
const addNewLineInParameterArray = (state: ParametersState, path: string): ParametersState => {
const propertyNames = path.split(".");
const array = getIn(state, propertyNames, undefined);
if (!Array.isArray(array)) {
throw new Error(`The value at ${path} should be an array. Got: ${typeof array}`);
}
const newLine = { ...array[array.length - 1] };
return setIn(state, propertyNames, [...array, newLine]);
};
const removeLastLineInParameterArray = (state: ParametersState, path: string): ParametersState => {
const propertyNames = path.split(".");
const array = getIn(state, propertyNames, undefined);
if (!Array.isArray(array)) {
throw new Error(`The value at ${path} should be an array. Got: ${typeof array}`);
}
if (array.length === 1) {
return state;
}
const newArray = array.slice(0, array.length - 1);
return setIn(state, propertyNames, newArray);
};
type AmendementAction =
UpdateParameterAction |
AddNewLineInParameterArrayAction |
RemoveLastLineInParameterArrayAction;
export function amendement(state: ParametersState, action: AmendementAction): ParametersState {
// state2 might be equal to state.
const state2 = combineReducers({
dotations,
impot_revenu: ir,
})(state, action);
switch (action.type) {
case "UPDATE_PARAMETER":
return updateParameter(
state2,
action.path,
action.value,
);
case "ADD_NEW_LINE_IN_PARAMETER_ARRAY":
return addNewLineInParameterArray(
state2,
action.path,
);
case "REMOVE_LAST_LINE_IN_PARAMETER_ARRAY":
return removeLastLineInParameterArray(
state2,
action.path,
);
default:
return state2;
}
}
import { getIn, setIn } from "immutable";
import { cloneDeep, get, set } from "lodash";
import {
import { BASE_IR_DEFAULT_STATE } from "../base";
// eslint-disable-next-line no-unused-vars
AddNewLineInParameterArrayAction,
// eslint-disable-next-line no-unused-vars
RemoveLastLineInParameterArrayAction,
// eslint-disable-next-line no-unused-vars
UpdateParameterAction,
} from "../../actions";
import { BASE_DEFAULT_STATE } from "./base";
// eslint-disable-next-line no-unused-vars
import { ParametersState } from "./parameters-state";
import { PLF_DEFAULT_STATE } from "./plf";
import { IRState } from "../interfaces";
import { PLF_IR_DEFAULT_STATE } from "../plf";
const DEFAULT_STATE = cloneDeep(PLF_DEFAULT_STATE);
const AMENDEMENT_IR_DEFAULT_STATE = cloneDeep(PLF_IR_DEFAULT_STATE);
const changeValueArray = (arrayToChange, indexToChange, newValue) => {
// renvoie arrayToChange avec la valeur située
......@@ -26,91 +17,67 @@ const changeValueArray = (arrayToChange, indexToChange, newValue) => {
return list;
};
const updateTaux = (prevState: ParametersState, name, value): ParametersState => {
const updateTaux = (prevState: IRState, name, value): IRState => {
const identifier = parseInt(name.substring(4), 10);
let list = get(prevState, "impot_revenu.bareme.taux");
let list = get(prevState, "bareme.taux");
list = changeValueArray(list, identifier, value);
set(prevState, "impot_revenu.bareme.taux", list);
set(prevState, "bareme.taux", list);
return prevState;
};
const updateBareme = (prevState: ParametersState, name, value): ParametersState => {
const updateBareme = (prevState: IRState, name, value): IRState => {
if (Number.isNaN(value)) return prevState;
const identifier = parseInt(name.substring(5), 10);
let list = get(prevState, "impot_revenu.bareme.seuils");
let list = get(prevState, "bareme.seuils");
list = changeValueArray(list, identifier, parseInt(value, 10));
set(prevState, "impot_revenu.bareme.seuils", list);
set(prevState, "bareme.seuils", list);
return prevState;
};
const updateGenerique = (prevState: ParametersState, name, value): ParametersState => {
const updateGenerique = (prevState: IRState, name, value): IRState => {
const identifier = name;
const regex = RegExp("^[0-9a-zA-Z_.]+$");
const shouldUpdate = regex.test(identifier);
if (!shouldUpdate) return prevState;
set(prevState, `impot_revenu.${identifier}`, value);
set(prevState, identifier, value);
return prevState;
};
const addTranche = (prevState: ParametersState): ParametersState => {
const seuils = get(prevState, "impot_revenu.bareme.seuils");
const addTranche = (prevState: IRState): IRState => {
const seuils = get(prevState, "bareme.seuils");
const newbt = seuils.length + 1;
const lastIndex = newbt - 2;
let lastSeuil = get(prevState, `impot_revenu.bareme.seuils.${lastIndex}`);
let lastSeuil = get(prevState, `bareme.seuils.${lastIndex}`);
lastSeuil += 1;
const nextSeuil = seuils.concat(lastSeuil);
set(prevState, "impot_revenu.bareme.seuils", nextSeuil);
set(prevState, "bareme.seuils", nextSeuil);
const taux = get(prevState, "impot_revenu.bareme.taux");
const lastTaux = get(prevState, `impot_revenu.bareme.taux.${lastIndex}`);
const taux = get(prevState, "bareme.taux");
const lastTaux = get(prevState, `bareme.taux.${lastIndex}`);
const nextTaux = taux.concat(lastTaux);
set(prevState, "impot_revenu.bareme.taux", nextTaux);
set(prevState, "bareme.taux", nextTaux);
return prevState;
};
const removeTranche = (prevState: ParametersState): ParametersState => {
const seuils = get(prevState, "impot_revenu.bareme.seuils");
const removeTranche = (prevState: IRState): IRState => {
const seuils = get(prevState, "bareme.seuils");
const newnbt = seuils.length - 1;
if (newnbt <= 0) return prevState;
const nextSeuils = seuils.slice(0, newnbt);
set(prevState, "impot_revenu.bareme.seuils", nextSeuils);
set(prevState, "bareme.seuils", nextSeuils);
const taux = get(prevState, "impot_revenu.bareme.taux");
const taux = get(prevState, "bareme.taux");
const nextTaux = taux.slice(0, newnbt);
set(prevState, "impot_revenu.bareme.taux", nextTaux);
set(prevState, "bareme.taux", nextTaux);
return prevState;
};
const updateParameter = (state: ParametersState, path: string, value: any): ParametersState => setIn(state, path.split("."), value);
const addNewLineInParameterArray = (state: ParametersState, path: string): ParametersState => {
const propertyNames = path.split(".");
const array = getIn(state, propertyNames, undefined);
if (!Array.isArray(array)) {
throw new Error(`The value at ${path} should be an array. Got: ${typeof array}`);
}
const newLine = { ...array[array.length - 1] };
return setIn(state, propertyNames, [...array, newLine]);
};
const removeLastLineInParameterArray = (state: ParametersState, path: string): ParametersState => {
const propertyNames = path.split(".");
const array = getIn(state, propertyNames, undefined);
if (!Array.isArray(array)) {
throw new Error(`The value at ${path} should be an array. Got: ${typeof array}`);
}
if (array.length === 1) {
return state;
}
const newArray = array.slice(0, array.length - 1);
return setIn(state, propertyNames, newArray);
};
export const amendement = (state: ParametersState = DEFAULT_STATE, action): ParametersState => {
export const ir = (state: IRState = AMENDEMENT_IR_DEFAULT_STATE, action): IRState => {
const { name, value } = action || {};
// TODO: remove this cloneDeep which causes performance issues.
const nextState = cloneDeep(state);
switch (action.type) {
case "onArticleAddTranche":
......@@ -126,25 +93,15 @@ export const amendement = (state: ParametersState = DEFAULT_STATE, action): Para
case "onUpdateReformePlafond":
return updateGenerique(nextState, name, value);
case "RESET_AMENDEMENT_TO_PLF":
return setIn(state, [action.topic], cloneDeep(PLF_DEFAULT_STATE[action.topic]));
if (action.topic === "impot_revenu") {
return cloneDeep(PLF_IR_DEFAULT_STATE);
}
return state;
case "RESET_AMENDEMENT_TO_BASE":
return setIn(state, [action.topic], cloneDeep(BASE_DEFAULT_STATE[action.topic]));
case "UPDATE_PARAMETER":
return updateParameter(
state,
(action as UpdateParameterAction).path,
(action as UpdateParameterAction).value,
);
case "ADD_NEW_LINE_IN_PARAMETER_ARRAY":
return addNewLineInParameterArray(
state,
(action as AddNewLineInParameterArrayAction).path,
);
case "REMOVE_LAST_LINE_IN_PARAMETER_ARRAY":
return removeLastLineInParameterArray(
state,
(action as RemoveLastLineInParameterArrayAction).path,
);
if (action.topic === "impot_revenu") {
return cloneDeep(BASE_IR_DEFAULT_STATE);
}
return state;
default:
return nextState;
}
......
// eslint-disable-next-line no-unused-vars
import { ParametersState } from "./parameters-state";
export const BASE_DEFAULT_STATE: ParametersState = {
dotations: {},
impot_revenu: {
bareme: {
seuils: [10064, 25659, 73369, 157806],
taux: [11, 30, 41, 45],
},
calculNombreParts: {
bonusParentIsole: {
auMoinsUnChargePrincipale: 0.5,
zeroChargePrincipaleUnPartage: 0.25,
zeroChargeprincipaleDeuxOuPlusPartage: 0.5,
},
partsParPACAuDela: 1,
partsParPACChargePartagee: {
deuxOuPlusChargePrincipale: { suivants: 0.5 },
unChargePrincipale: { premier: 0.25, suivants: 0.5 },
zeroChargePrincipale: { deuxPremiers: 0.25, suivants: 0.5 },
},
partsSelonNombrePAC: [
{
celibataire: 1, divorce: 1, mariesOuPacses: 2, veuf: 1,
},
{
celibataire: 1.5, divorce: 1.5, mariesOuPacses: 2.5, veuf: 2.5,
},
{
celibataire: 2, divorce: 2, mariesOuPacses: 3, veuf: 3,
},
{
celibataire: 3, divorce: 3, mariesOuPacses: 4, veuf: 4,
},
{
celibataire: 4, divorce: 4, mariesOuPacses: 5, veuf: 5,
},
{
celibataire: 5, divorce: 5, mariesOuPacses: 6, veuf: 6,
},
{
celibataire: 6, divorce: 6, mariesOuPacses: 7, veuf: 7,
},
],
},
decote: {
seuil_celib: 777,
seuil_couple: 1286,
taux: 45.25,
},
plafond_qf: {
abat_dom: {
plaf_GuadMarReu: 2450,
plaf_GuyMay: 4050,
taux_GuadMarReu: 30,
taux_GuyMay: 40,
},
celib: 936,
celib_enf: 3697,
maries_ou_pacses: 1567,
reduc_postplafond: 1562,
reduc_postplafond_veuf: 1745,
},
},
};
export const base = (state = BASE_DEFAULT_STATE) => state;
// eslint-disable-next-line no-unused-vars
import { DotationsState } from "../interfaces";
export const BASE_DOTATIONS_DEFAULT_STATE: DotationsState = {};
export const dotations = (state = BASE_DOTATIONS_DEFAULT_STATE) => state;
import { combineReducers } from "redux";
import { dotations } from "./dotations";
import { ir } from "./ir";
export const base = combineReducers({
dotations,
impot_revenu: ir,
});
export { BASE_IR_DEFAULT_STATE } from "./ir";
export { BASE_DOTATIONS_DEFAULT_STATE } from "./dotations";
// eslint-disable-next-line no-unused-vars
import { IRState } from "../interfaces";
export const BASE_IR_DEFAULT_STATE: IRState = {
bareme: {
seuils: [10064, 25659, 73369, 157806],
taux: [11, 30, 41, 45],
},
calculNombreParts: {
bonusParentIsole: {
auMoinsUnChargePrincipale: 0.5,
zeroChargePrincipaleUnPartage: 0.25,
zeroChargeprincipaleDeuxOuPlusPartage: 0.5,
},
partsParPACAuDela: 1,
partsParPACChargePartagee: {
deuxOuPlusChargePrincipale: { suivants: 0.5 },
unChargePrincipale: { premier: 0.25, suivants: 0.5 },
zeroChargePrincipale: { deuxPremiers: 0.25, suivants: 0.5 },
},
partsSelonNombrePAC: [
{
celibataire: 1, divorce: 1, mariesOuPacses: 2, veuf: 1,
},
{
celibataire: 1.5, divorce: 1.5, mariesOuPacses: 2.5, veuf: 2.5,
},
{
celibataire: 2, divorce: 2, mariesOuPacses: 3, veuf: 3,
},
{
celibataire: 3, divorce: 3, mariesOuPacses: 4, veuf: 4,
},
{
celibataire: 4, divorce: 4, mariesOuPacses: 5, veuf: 5,
},
{
celibataire: 5, divorce: 5, mariesOuPacses: 6, veuf: 6,
},
{
celibataire: 6, divorce: 6, mariesOuPacses: 7, veuf: 7,
},
],
},
decote: {
seuil_celib: 777,
seuil_couple: 1286,
taux: 45.25,
},
plafond_qf: {
abat_dom: {
plaf_GuadMarReu: 2450,
plaf_GuyMay: 4050,
taux_GuadMarReu: 30,
taux_GuyMay: 40,
},
celib: 936,
celib_enf: 3697,
maries_ou_pacses: 1567,
reduc_postplafond: 1562,
reduc_postplafond_veuf: 1745,
},
};
export const ir = (state = BASE_IR_DEFAULT_STATE) => state;
......@@ -4,7 +4,7 @@ import { amendement } from "./amendement";
import { base } from "./base";
import { plf } from "./plf";
export * from "./parameters-state";
export * from "./interfaces";
export const parameters = combineReducers({
amendement,
......
export interface DotationsState {}
/* eslint-disable camelcase */
import { DotationsState } from "./dotations-state";
import { IRState } from "./ir-state";
export interface ParametersState {
dotations: DotationsState;
impot_revenu: IRState;
}
export type { DotationsState, IRState };
/* eslint-disable camelcase */
export interface IRState {
bareme: {
seuils: number[];
taux: number[];
};
decote: {
seuil_celib: number;
seuil_couple: number;
taux: number;
};
plafond_qf: {
abat_dom: {
plaf_GuadMarReu: number;
plaf_GuyMay: number;
taux_GuadMarReu: number;
taux_GuyMay: number;
};
celib: number;
celib_enf: number;
maries_ou_pacses: number;
reduc_postplafond: number;
reduc_postplafond_veuf: number;
};
calculNombreParts: {
partsSelonNombrePAC: {
veuf: number;
mariesOuPacses: number;
celibataire: number;
divorce: number
}[];
partsParPACAuDela: number;
partsParPACChargePartagee: {
zeroChargePrincipale: {
deuxPremiers: number;
suivants: number
};
unChargePrincipale: {
premier: number;
suivants: number
};
deuxOuPlusChargePrincipale: {
suivants: number
};
};
bonusParentIsole: {
auMoinsUnChargePrincipale: number;
zeroChargePrincipaleUnPartage: number;
zeroChargeprincipaleDeuxOuPlusPartage: number;
};
}
}
/* eslint-disable camelcase */
export interface ParametersState {
dotations: {};
impot_revenu: {
bareme: {
seuils: number[];
taux: number[];
};
decote: {
seuil_celib: number;
seuil_couple: number;
taux: number;
};
plafond_qf: {
abat_dom: {
plaf_GuadMarReu: number;
plaf_GuyMay: number;
taux_GuadMarReu: number;
taux_GuyMay: number;
};
celib: number;
celib_enf: number;
maries_ou_pacses: number;
reduc_postplafond: number;
reduc_postplafond_veuf: number;
};
calculNombreParts: {
partsSelonNombrePAC: {
veuf: number;
mariesOuPacses: number;
celibataire: number;
divorce: number
}[];
partsParPACAuDela: number;
partsParPACChargePartagee: {
zeroChargePrincipale: {
deuxPremiers: number;
suivants: number
};
unChargePrincipale: {
premier: number;
suivants: number
};
deuxOuPlusChargePrincipale: {
suivants: number
};
};
bonusParentIsole: {
auMoinsUnChargePrincipale: number;
zeroChargePrincipaleUnPartage: number;
zeroChargeprincipaleDeuxOuPlusPartage: number;
};
}
};
}
// eslint-disable-next-line no-unused-vars
import { ParametersState } from "./parameters-state";
export const PLF_DEFAULT_STATE: ParametersState = {
dotations: {},
impot_revenu: {
bareme: {
seuils: [10064, 25659, 73369, 157806],
taux: [11, 30, 41, 45],
},
calculNombreParts: {
bonusParentIsole: {
auMoinsUnChargePrincipale: 0.5,
zeroChargePrincipaleUnPartage: 0.25,
zeroChargeprincipaleDeuxOuPlusPartage: 0.5,
},
partsParPACAuDela: 1,
partsParPACChargePartagee: {
deuxOuPlusChargePrincipale: { suivants: 0.5 },
unChargePrincipale: { premier: 0.25, suivants: 0.5 },
zeroChargePrincipale: { deuxPremiers: 0.25, suivants: 0.5 },
},
partsSelonNombrePAC: [
{
celibataire: 1, divorce: 1, mariesOuPacses: 2, veuf: 1,
},
{
celibataire: 1.5, divorce: 1.5, mariesOuPacses: 2.5, veuf: 2.5,
},
{
celibataire: 2, divorce: 2, mariesOuPacses: 3, veuf: 3,
},
{
celibataire: 3, divorce: 3, mariesOuPacses: 4, veuf: 4,
},
{
celibataire: 4, divorce: 4, mariesOuPacses: 5, veuf: 5,
},
{
celibataire: 5, divorce: 5, mariesOuPacses: 6, veuf: 6,
},
{
celibataire: 6, divorce: 6, mariesOuPacses: 7, veuf: 7,
},
],
},
decote: {
seuil_celib: 777,
seuil_couple: 1286,
taux: 45.25,
},
plafond_qf: {
abat_dom: {
plaf_GuadMarReu: 2450,
plaf_GuyMay: 4050,
taux_GuadMarReu: 30,
taux_GuyMay: 40,
},
celib: 936,
celib_enf: 3697,
maries_ou_pacses: 1567,
reduc_postplafond: 1562,
reduc_postplafond_veuf: 1745,
},
},
};
export const plf = (state: ParametersState|null = null) => state;
// eslint-disable-next-line no-unused-vars
import { DotationsState } from "../interfaces";
export const PLF_DOTATIONS_DEFAULT_STATE: DotationsState = {};
export const dotations = (state = PLF_DOTATIONS_DEFAULT_STATE) => state;
import { combineReducers } from "redux";
// eslint-disable-next-line no-unused-vars
import { ParametersState } from "../interfaces";
import { dotations } from "./dotations";
import { ir } from "./ir";
const PLF_ENABLED = false;
export const plf = PLF_ENABLED ? combineReducers({
dotations,
impot_revenu: ir,
}) : (state: ParametersState|null = null) => state;
export { PLF_IR_DEFAULT_STATE } from "./ir";
export { PLF_DOTATIONS_DEFAULT_STATE } from "./dotations";
// eslint-disable-next-line no-unused-vars
import { IRState } from "../interfaces";
export const PLF_IR_DEFAULT_STATE: IRState = {
bareme: {
seuils: [10064, 25659, 73369, 157806],
taux: [11, 30, 41, 45],
},
calculNombreParts: {
bonusParentIsole: {
auMoinsUnChargePrincipale: 0.5,
zeroChargePrincipaleUnPartage: 0.25,
zeroChargeprincipaleDeuxOuPlusPartage: 0.5,
},
partsParPACAuDela: 1,
partsParPACChargePartagee: {
deuxOuPlusChargePrincipale: { suivants: 0.5 },
unChargePrincipale: { premier: 0.25, suivants: 0.5 },
zeroChargePrincipale: { deuxPremiers: 0.25, suivants: 0.5 },
},
partsSelonNombrePAC: [
{
celibataire: 1, divorce: 1, mariesOuPacses: 2, veuf: 1,
},
{
celibataire: 1.5, divorce: 1.5, mariesOuPacses: 2.5, veuf: 2.5,
},
{
celibataire: 2, divorce: 2, mariesOuPacses: 3, veuf: 3,
},
{
celibataire: 3, divorce: 3, mariesOuPacses: 4, veuf: 4,
},
{
celibataire: 4, divorce: 4, mariesOuPacses: 5, veuf: 5,
},
{
celibataire: 5, divorce: 5, mariesOuPacses: 6, veuf: 6,
},
{
celibataire: 6, divorce: 6, mariesOuPacses: 7, veuf: 7,
},
],
},
decote: {
seuil_celib: 777,
seuil_couple: 1286,
taux: 45.25,
},
plafond_qf: {
abat_dom: {
plaf_GuadMarReu: 2450,
plaf_GuyMay: 4050,
taux_GuadMarReu: 30,
taux_GuyMay: 40,
},
celib: 936,
celib_enf: 3697,
maries_ou_pacses: 1567,
reduc_postplafond: 1562,
reduc_postplafond_veuf: 1745,
},
};
export const ir = (state = PLF_IR_DEFAULT_STATE) => state;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment