import R from "ramda" import React, { Component } from "react" import { connect } from "react-redux" import { withRouter } from "react-router" import { formValueSelector } from "redux-form" import "./Results.css" import "../engine/mecanismViews/Somme.css" import { humanFigure } from "./rule/RuleValueVignette" import { capitalise0 } from "../utils" import { nameLeaf } from "Engine/rules" // Filtered variables and rules can't be filtered in a uniform way, for now let paidBy = R.pathEq(["explanation", "cotisation", "dû par"]) let filteredBy = R.pathEq(["cotisation", "dû par"]) export let byName = R.groupBy(R.prop("dottedName")) export let cell = (branch, payer, analysis) => { let row = byBranch(analysis)[branch], items = R.filter( item => paidBy(payer)(item) || filteredBy(payer)(item), row ), values = R.map(R.prop("nodeValue"), items) return R.sum(values) } export let subCell = (row, name, payer) => { let cells = row[name], items = R.filter( item => paidBy(payer)(item) || filteredBy(payer)(item), cells ), values = R.map(R.prop("nodeValue"), items) return R.sum(values) } export let byBranch = analysis => { let sal = analysis.dict["contrat salarié . cotisations salariales"] let pat = analysis.dict["contrat salarié . cotisations patronales"] let l1 = sal ? sal.explanation.formule.explanation.explanation : [], l2 = pat ? pat.explanation.formule.explanation.explanation : [], explanations = R.concat(l1, l2), byBranch = R.groupBy( R.pathOr("autre", ["explanation", "cotisation", "branche"]), explanations ) return byBranch } @withRouter @connect(state => ({ analysis: state.analysis, targetNames: state.targetNames, situationGate: state.situationGate, inversions: formValueSelector("conversation")(state, "inversions"), done: state.done })) export default class ResultsGrid extends Component { render() { let { analysis, situationGate, targetNames, inversions, done } = this.props if (!done) return null if (!analysis) return null let extract = x => (x && x.nodeValue) || 0, fromSituation = name => situationGate(name), fromEval = name => R.find(R.propEq("dottedName", name), analysis.targets), fromDict = name => analysis.dict[name], get = name => extract(fromSituation(name) || fromEval(name) || fromDict(name)) let results = byBranch(analysis), brut = get("contrat salarié . salaire brut"), net = get("contrat salarié . salaire net"), total = get("contrat salarié . salaire total") let inversion = R.path( ["contrat salarié ", " salaire de base"], inversions ), relevantSalaries = new Set( targetNames .concat(inversion ? [nameLeaf(inversion)] : []) .concat(["salaire de base"]) ) return (
{R.keys(results).map(branch => { let props = { key: branch, branch, values: results[branch], analysis, relevantSalaries } return })} )} {relevantSalaries.has("salaire total") && [ , ]}
{humanFigure(2)(brut)}{" "} Salaire brut
{relevantSalaries.has("salaire net") && ( <> = {humanFigure(2)(net)}{" "} Salaire net = {humanFigure(2)(total)}{" "} Salaire total
) } } class Row extends Component { state = { folded: true } render() { let { branch, values, analysis, relevantSalaries } = this.props, detail = byName(values) let title = name => { let node = R.head(detail[name]) return node.title || capitalise0(node.name) } let aggregateRow = ( this.setState({ folded: !this.state.folded })} > {capitalise0(branch)}  {this.state.folded ? "déplier >" : "replier"} {this.state.folded ? ( <> {relevantSalaries.has("salaire net") && ( <> - {humanFigure(2)(cell(branch, "salarié", analysis))} )} {relevantSalaries.has("salaire total") && ( <> + {humanFigure(2)(cell(branch, "employeur", analysis))} )} ) : ( )} ) let detailRows = this.state.folded ? [] : R.keys(detail).map(subCellName => (  {title(subCellName)} {relevantSalaries.has("salaire net") && ( <> - {humanFigure(2)(subCell(detail, subCellName, "salarié"))} )} {relevantSalaries.has("salaire total") && ( <> + {humanFigure(2)(subCell(detail, subCellName, "employeur"))} )} )) // returns an array of return R.concat([aggregateRow], detailRows) } } // TODO Ce code est beaucoup trop spécifique // C'est essentiellement une copie de Row class ReductionRow extends Component { state = { folded: true } render() { let {relevantSalaries, node} = this.props if (!relevantSalaries.has('salaire total')) return null let value = node.nodeValue let aggregateRow = ( this.setState({ folded: !this.state.folded })} > Réductions   {this.state.folded ? "déplier >" : "replier"} {this.state.folded ? ( <> {relevantSalaries.has("salaire net") && ( <> - {humanFigure(2)(0)} )} {relevantSalaries.has("salaire total") && ( <> + {humanFigure(2)(value)} )} ) : ( )} ) let detailRow = this.state.folded ? null :  Réduction générale {relevantSalaries.has("salaire net") && ( <> - {humanFigure(2)(0)} )} {relevantSalaries.has("salaire total") && ( <> + {humanFigure(2)(value)} )} // returns an array of return [aggregateRow, detailRow] } }