From 41e18da90f0f66950d08efed1aaa77724cbf45a0 Mon Sep 17 00:00:00 2001 From: akkoul thinhinane Date: Mon, 6 Jan 2020 10:51:17 +0100 Subject: [PATCH] creation du controlleur venteparregion --- .../RepartitionDesVentesParRegion.php | 57 ++++++++++++ api/src/Entity/ValeursFonciere.php | 20 ++++ client/src/Helpers/PieSVG.js | 50 ++++++++++ .../ Repartitiondesventesparregion.js | 92 +++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 api/src/Controller/RepartitionDesVentesParRegion.php create mode 100644 client/src/Helpers/PieSVG.js create mode 100644 client/src/components/valeursfonciere/ Repartitiondesventesparregion.js diff --git a/api/src/Controller/RepartitionDesVentesParRegion.php b/api/src/Controller/RepartitionDesVentesParRegion.php new file mode 100644 index 0000000..d6ab845 --- /dev/null +++ b/api/src/Controller/RepartitionDesVentesParRegion.php @@ -0,0 +1,57 @@ +em = $em; + } + + public function __invoke(Request $data) { + + $anneeFiltre = $data->query->get('anneeFiltre'); + $query = " SELECT + COUNT(valeurs_fonciere.nature_mutation) AS nombre_de_vente, + valeurs_fonciere.region AS region + FROM + App:ValeursFonciere AS valeurs_fonciere + WHERE + lower(valeurs_fonciere.nature_mutation) = 'vente' + AND + TO_CHAR(valeurs_fonciere.date_mutation, 'YYYY') = '$anneeFiltre' + GROUP BY + region + ORDER BY + region"; + + + $nombreVentes = $this->em->createQuery($query)->getResult(); + foreach ($nombreVentes as &$nombreVente){ + $nombreVente['nombre_de_vente'] = intval($nombreVente['nombre_de_vente']); + $nombreVente['region'] = $nombreVente["region"]; + } + $res = new JsonResponse( + $nombreVentes, + Response::HTTP_OK + ); + return $res; + } +} \ No newline at end of file diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index 47f5f5d..6023bdb 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -84,6 +84,26 @@ use Doctrine\ORM\Mapping as ORM; * "route_name"="nombre_devente_parJMA", * "controller"=NombreDeVenteParJMA::class, * "pagination_enabled"=false, + * }, + * "repartition_des_ventes_par_region"={ + * "method"="GET", + * "openapi_context"={ + * "read"=false, + * "parameters"={ + * { + * "in"="query", + * "name"="anneeFiltre", + * "required"= true, + * "schema"= { + * "type"="number", + * }, + * "example"="2016" + * } + * } + * }, + * "route_name"="repartition_des_ventes_par_region", + * "controller"=RepartitionDesVentesParRegion::class, + * "pagination_enabled"=false, * } * }) * @ORM\Entity(repositoryClass="App\Repository\ValeursFonciereRepository") diff --git a/client/src/Helpers/PieSVG.js b/client/src/Helpers/PieSVG.js new file mode 100644 index 0000000..50089f3 --- /dev/null +++ b/client/src/Helpers/PieSVG.js @@ -0,0 +1,50 @@ +import React from "react"; +import * as d3 from "d3"; + +const Arc = ({ data, index, createArc, colors, format }) => ( + + + + {format(data.value)} + + +); + +const Pie = props => { + const createPie = d3 + .pie() + .value(d => d.value) + .sort(null); + const createArc = d3 + .arc() + .innerRadius(props.innerRadius) + .outerRadius(props.outerRadius); + const colors = d3.scaleOrdinal(d3.schemeCategory10); + const format = d3.format(".2f"); + const data = createPie(props.data); + + return ( + + + {data.map((d, i) => ( + + ))} + + + ); +}; + +export default Pie; diff --git a/client/src/components/valeursfonciere/ Repartitiondesventesparregion.js b/client/src/components/valeursfonciere/ Repartitiondesventesparregion.js new file mode 100644 index 0000000..fb81824 --- /dev/null +++ b/client/src/components/valeursfonciere/ Repartitiondesventesparregion.js @@ -0,0 +1,92 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import * as d3 from "d3"; +import PieSVG from "../../Helpers/PieSVG"; + +class Repartitiondesventesparregion extends React.Component { + constructor(props) { + super(props); + + this.state = {annee: '2018',data: []}; + + }; + + componentWillMount(){ + console.log('Je suis appeler en premier!'); + } + + getData(){ + fetch(`https://${document.domain}:8443/repartitionDesVentesParRegion?anneeFiltre=${this.state.annee}`) + .then(response => { + if (response.ok) { + const data = response.json() + return data; + } else { + throw new Error('Something went wrong ...'); + } + }) + .then(data => { + this.setState({data: data }); + }) + .catch(error => console.log("error")); + } + + componentDidMount(){ + this.timerID = setInterval( + () => this.getData(), + 1000 + ); + + } + + handleChange(event) { + this.setState({ annee: event.target.value}); + }; + + render() { + + function parseData(data) { + var arr = []; + data.map(function (thisList){ + arr.push({ + nombre_de_vente: thisList.nombre_de_vente | 0, + dat : thisList.dat + }); + }) + return arr; + } + + const c =parseData(this.state.data) + + const generateData = () => + c.map((item, index) => ({ + index: index, + date: new Date(item.dat).toLocaleDateString('fr-FR', {day: 'numeric', year: 'numeric', month: 'long' }), + value: item.nombre_de_vente + })); + + const data = generateData(); + console.log(data) + + return ( +
+
+ + + + SVG Elements + +
+ +
+ ); + } + } + + export default Repartitiondesventesparregion; \ No newline at end of file -- GitLab