From 59a7599c3945e574003e7b7ae75d34e8c316308f Mon Sep 17 00:00:00 2001 From: Fawaz IBRAHIM Date: Tue, 31 Dec 2019 14:20:09 +0100 Subject: [PATCH 01/11] Charger seulement les maisons et les apparts --- api/src/DataFixtures/AppFixtures.php | 36 +++++++++++++++------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/api/src/DataFixtures/AppFixtures.php b/api/src/DataFixtures/AppFixtures.php index 6262211..bb4c25c 100644 --- a/api/src/DataFixtures/AppFixtures.php +++ b/api/src/DataFixtures/AppFixtures.php @@ -41,25 +41,27 @@ class AppFixtures extends Fixture $numRecordsRead = 0; foreach ($records as $row) { + $codeTypeLocal = intval($row[35]); + if($codeTypeLocal == 1 || $codeTypeLocal == 2) { + // Créer un nouveau "Entity" + $valeursFonciere = new ValeursFonciere(); + $valeursFonciere->setDateMutation(\DateTime::createFromFormat("d/m/Y", $row[8])); + $valeursFonciere->setNatureMutation($row[9]); + $valeursFonciere->setValeurFonciere(floatval(str_replace(',', '.', $row[10]))); + $valeursFonciere->setCommune($row[17]); + $valeursFonciere->setCodeCommune(intval($row[19])); + $valeursFonciere->setCodeTypeLocal(intval($row[35])); + $valeursFonciere->setTypeLocal($row[36]); + $valeursFonciere->setSurfaceReelleBati(floatval(str_replace(',', '.', $row[38]))); + $manager->persist($valeursFonciere); - // Créer un nouveau "Entity" - $valeursFonciere = new ValeursFonciere(); - $valeursFonciere->setDateMutation(\DateTime::createFromFormat("d/m/Y", $row[8])); - $valeursFonciere->setNatureMutation($row[9]); - $valeursFonciere->setValeurFonciere(floatval(str_replace(',', '.', $row[10]))); - $valeursFonciere->setCommune($row[17]); - $valeursFonciere->setCodeCommune(intval($row[19])); - $valeursFonciere->setCodeTypeLocal(intval($row[35])); - $valeursFonciere->setTypeLocal($row[36]); - $valeursFonciere->setSurfaceReelleBati(floatval(str_replace(',', '.', $row[38]))); - $manager->persist($valeursFonciere); + $numRecordsRead++; - $numRecordsRead++; - - // On fait un "Flush" chaque 100 records - if(($numRecordsRead % $recordsLimitByLoop) == 0){ - $manager->flush(); - $manager->clear(); + // On fait un "Flush" chaque 100 records + if (($numRecordsRead % $recordsLimitByLoop) == 0) { + $manager->flush(); + $manager->clear(); + } } } -- GitLab From 935a18845f97af51a0e937d55fd6111f835b4942 Mon Sep 17 00:00:00 2001 From: Chousir21 Date: Tue, 31 Dec 2019 14:23:57 +0100 Subject: [PATCH 02/11] Ajout la librairie Doctrine Extensions --- api/composer.json | 1 + api/composer.lock | 56 ++++++++++++++++++++++++++++++- api/config/packages/doctrine.yaml | 3 ++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/api/composer.json b/api/composer.json index 61bfba8..ab542cb 100644 --- a/api/composer.json +++ b/api/composer.json @@ -5,6 +5,7 @@ "ext-ctype": "*", "ext-iconv": "*", "api-platform/api-pack": "^1.1", + "beberlei/doctrineextensions": "^1.2", "doctrine/doctrine-migrations-bundle": "^2.0", "guzzlehttp/guzzle": "^6.3", "league/csv": "^9.5", diff --git a/api/composer.lock b/api/composer.lock index 8dc42cf..2ff282d 100644 --- a/api/composer.lock +++ b/api/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "37aaa121253355e46b895eaf738b134d", + "content-hash": "61293d270d296b2e9ea43d49fe80c20d", "packages": [ { "name": "api-platform/api-pack", @@ -190,6 +190,60 @@ ], "time": "2019-11-23T11:27:39+00:00" }, + { + "name": "beberlei/doctrineextensions", + "version": "v1.2.6", + "source": { + "type": "git", + "url": "https://github.com/beberlei/DoctrineExtensions.git", + "reference": "af72c4a136b744f1268ca8bb4da47a2f8af78f86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beberlei/DoctrineExtensions/zipball/af72c4a136b744f1268ca8bb4da47a2f8af78f86", + "reference": "af72c4a136b744f1268ca8bb4da47a2f8af78f86", + "shasum": "" + }, + "require": { + "doctrine/orm": "^2.6", + "php": "^7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "nesbot/carbon": "*", + "phpunit/phpunit": "^7.0 || ^8.0", + "symfony/yaml": "^4.2", + "zf1/zend-date": "^1.12", + "zf1/zend-registry": "^1.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "DoctrineExtensions\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Steve Lacey", + "email": "steve@stevelacey.net" + } + ], + "description": "A set of extensions to Doctrine 2 that add support for additional query functions available in MySQL and Oracle.", + "keywords": [ + "database", + "doctrine", + "orm" + ], + "time": "2019-12-05T09:49:04+00:00" + }, { "name": "doctrine/annotations", "version": "v1.8.0", diff --git a/api/config/packages/doctrine.yaml b/api/config/packages/doctrine.yaml index 66d671f..7e6c080 100644 --- a/api/config/packages/doctrine.yaml +++ b/api/config/packages/doctrine.yaml @@ -17,3 +17,6 @@ doctrine: dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App + dql: + string_functions: + TO_CHAR: DoctrineExtensions\Query\Postgresql\DateFormat -- GitLab From 7d61164aa9378e86e8c5f3d1e210f4ddbc7b6482 Mon Sep 17 00:00:00 2001 From: Chousir21 Date: Tue, 31 Dec 2019 15:16:04 +0100 Subject: [PATCH 03/11] Ajout le custom route mean_price_for_squared_meter --- .../Controller/MeanPriceForSquaredMeter.php | 48 +++++++++++++++++++ api/src/Entity/ValeursFonciere.php | 12 ++++- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 api/src/Controller/MeanPriceForSquaredMeter.php diff --git a/api/src/Controller/MeanPriceForSquaredMeter.php b/api/src/Controller/MeanPriceForSquaredMeter.php new file mode 100644 index 0000000..bb4fa9e --- /dev/null +++ b/api/src/Controller/MeanPriceForSquaredMeter.php @@ -0,0 +1,48 @@ +em = $em; + } + + public function __invoke(Request $request,$year, $month) { + $year = 2015; + $month = 1; + if($month < 10){ + $month = '0'.$month; + } + $query = "SELECT + AVG(valeurs_fonciere.valeur_fonciere / valeurs_fonciere.surface_reelle_bati) AS mean_metre_price + FROM App:ValeursFonciere AS valeurs_fonciere + WHERE TO_CHAR(valeurs_fonciere.date_mutation, 'YYYY') LIKE '{$year}' + AND TO_CHAR(valeurs_fonciere.date_mutation, 'MM') LIKE '{$month}' + AND valeurs_fonciere.surface_reelle_bati > 0 + AND valeurs_fonciere.valeur_fonciere > 0"; + $metre_prices = $this->em->createQuery($query)->getResult(); + $metre_prices[0]['mean_metre_price'] = floatval($metre_prices[0]['mean_metre_price']); + $res = new JsonResponse( + $metre_prices[0], + Response::HTTP_OK + ); + return $res; + } +} diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index 7556435..0a30f6a 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -6,7 +6,17 @@ use ApiPlatform\Core\Annotation\ApiResource; use Doctrine\ORM\Mapping as ORM; /** - * @ApiResource() + * @ApiResource( + * collectionOperations={ + * "get","post", + * "meanpriceforsquaredmeter"={ + * "method"="GET", + * "route_name"="mean_price_for_squared_meter", + * "controller"=MeanPriceForSquaredMeter::class, + * "pagination_enabled"=false, + * } + * } + * ) * @ORM\Entity(repositoryClass="App\Repository\ValeursFonciereRepository") */ class ValeursFonciere -- GitLab From 5cf97e8c72edd91207557eabb55e737303d0d081 Mon Sep 17 00:00:00 2001 From: Chousir21 Date: Tue, 31 Dec 2019 15:30:23 +0100 Subject: [PATCH 04/11] =?UTF-8?q?Ajout=20de=20la=20documation=20Swagger=20?= =?UTF-8?q?=C3=A0=20l'op=C3=A9ration=20meanpriceforsquaredmeter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller/MeanPriceForSquaredMeter.php | 2 - api/src/Entity/ValeursFonciere.php | 43 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/api/src/Controller/MeanPriceForSquaredMeter.php b/api/src/Controller/MeanPriceForSquaredMeter.php index bb4fa9e..8c825ae 100644 --- a/api/src/Controller/MeanPriceForSquaredMeter.php +++ b/api/src/Controller/MeanPriceForSquaredMeter.php @@ -25,8 +25,6 @@ class MeanPriceForSquaredMeter extends AbstractController } public function __invoke(Request $request,$year, $month) { - $year = 2015; - $month = 1; if($month < 10){ $month = '0'.$month; } diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index 0a30f6a..0c3d048 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -11,6 +11,49 @@ use Doctrine\ORM\Mapping as ORM; * "get","post", * "meanpriceforsquaredmeter"={ * "method"="GET", + * "openapi_context"={ + * "summary"="Gets the mean of squared meter price for the selected year and month", + * "produces"={ + * "application/json" + * }, + * "parameters"={ + * { + * "name"="year", + * "in"="path", + * "schema":{ + * "type": "integer" + * }, + * "description":"The year", + * "required"=true + * }, + * { + * "name"="month", + * "in"="path", + * "schema":{ + * "type": "integer" + * }, + * "description":"The month", + * "required"=true + * } + * }, + * "responses"={ + * "200"={ + * "description"="Mean of squared meter price", + * "content"= { + * "application/json"={ + * "schema"={ + * "type"="object", + * "properties"={ + * "mean_metre_price"={ + * "type"="number" + * } + * } + * } + * } + * } + * } + * } + * }, * "route_name"="mean_price_for_squared_meter", * "controller"=MeanPriceForSquaredMeter::class, * "pagination_enabled"=false, -- GitLab From 9df3cb8935f6e9ec1539500466f30f0cd44f6924 Mon Sep 17 00:00:00 2001 From: Chousir21 Date: Wed, 1 Jan 2020 02:45:48 +0100 Subject: [PATCH 05/11] Fixer le route meanpriceforsquaredmeter --- .../Controller/MeanPriceForSquaredMeter.php | 40 ++++++++++++------- api/src/Entity/ValeursFonciere.php | 37 ++++++----------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/api/src/Controller/MeanPriceForSquaredMeter.php b/api/src/Controller/MeanPriceForSquaredMeter.php index 8c825ae..6a2aad8 100644 --- a/api/src/Controller/MeanPriceForSquaredMeter.php +++ b/api/src/Controller/MeanPriceForSquaredMeter.php @@ -12,7 +12,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; /** - * @Route("/mean-price-for-squared-meter/{year}/{month}", name="mean_price_for_squared_meter") + * @Route("/mean-price-for-squared-meter", name="mean_price_for_squared_meter") */ class MeanPriceForSquaredMeter extends AbstractController { @@ -24,21 +24,33 @@ class MeanPriceForSquaredMeter extends AbstractController $this->em = $em; } - public function __invoke(Request $request,$year, $month) { - if($month < 10){ - $month = '0'.$month; - } - $query = "SELECT - AVG(valeurs_fonciere.valeur_fonciere / valeurs_fonciere.surface_reelle_bati) AS mean_metre_price - FROM App:ValeursFonciere AS valeurs_fonciere - WHERE TO_CHAR(valeurs_fonciere.date_mutation, 'YYYY') LIKE '{$year}' - AND TO_CHAR(valeurs_fonciere.date_mutation, 'MM') LIKE '{$month}' - AND valeurs_fonciere.surface_reelle_bati > 0 - AND valeurs_fonciere.valeur_fonciere > 0"; + public function __invoke(Request $request) { + $query = " SELECT + TO_CHAR(valeurs_fonciere.date_mutation, 'YYYY') AS year, + TO_CHAR(valeurs_fonciere.date_mutation, 'MM') AS month, + AVG(valeurs_fonciere.valeur_fonciere / valeurs_fonciere.surface_reelle_bati) AS mean_metre_price + FROM + App:ValeursFonciere AS valeurs_fonciere + WHERE + valeurs_fonciere.surface_reelle_bati > 0 + AND + valeurs_fonciere.valeur_fonciere > 0 + AND + lower(valeurs_fonciere.nature_mutation) = 'vente' + GROUP BY + year, + month + ORDER BY + year, + month"; $metre_prices = $this->em->createQuery($query)->getResult(); - $metre_prices[0]['mean_metre_price'] = floatval($metre_prices[0]['mean_metre_price']); + foreach ($metre_prices as &$metre_price){ + $metre_price['year'] = intval($metre_price['year']); + $metre_price['month'] = intval($metre_price['month']); + $metre_price['mean_metre_price'] = floatval($metre_price['mean_metre_price']); + } $res = new JsonResponse( - $metre_prices[0], + $metre_prices, Response::HTTP_OK ); return $res; diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index 0c3d048..6e43474 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -16,36 +16,25 @@ use Doctrine\ORM\Mapping as ORM; * "produces"={ * "application/json" * }, - * "parameters"={ - * { - * "name"="year", - * "in"="path", - * "schema":{ - * "type": "integer" - * }, - * "description":"The year", - * "required"=true - * }, - * { - * "name"="month", - * "in"="path", - * "schema":{ - * "type": "integer" - * }, - * "description":"The month", - * "required"=true - * } - * }, * "responses"={ * "200"={ * "description"="Mean of squared meter price", * "content"= { * "application/json"={ * "schema"={ - * "type"="object", - * "properties"={ - * "mean_metre_price"={ - * "type"="number" + * "type"="array", + * "items"={ + * "type"="object", + * "properties"={ + * "year"={ + * "type"="number" + * }, + * "month"={ + * "type"="number" + * }, + * "mean_metre_price"={ + * "type"="number" + * } * } * } * } -- GitLab From 6b35cccf5366735143f7129504a860261685e3ae Mon Sep 17 00:00:00 2001 From: Fawaz IBRAHIM Date: Wed, 1 Jan 2020 03:25:21 +0100 Subject: [PATCH 06/11] Ajout de la route number-of-sold-by-params --- api/config/packages/doctrine.yaml | 1 + api/src/Controller/NumberOfSoldByParams.php | 62 +++++++++++++++++ api/src/Entity/ValeursFonciere.php | 75 +++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 api/src/Controller/NumberOfSoldByParams.php diff --git a/api/config/packages/doctrine.yaml b/api/config/packages/doctrine.yaml index 7e6c080..97df408 100644 --- a/api/config/packages/doctrine.yaml +++ b/api/config/packages/doctrine.yaml @@ -20,3 +20,4 @@ doctrine: dql: string_functions: TO_CHAR: DoctrineExtensions\Query\Postgresql\DateFormat + TO_DATE: DoctrineExtensions\Query\Postgresql\StrToDate diff --git a/api/src/Controller/NumberOfSoldByParams.php b/api/src/Controller/NumberOfSoldByParams.php new file mode 100644 index 0000000..5f6c8fb --- /dev/null +++ b/api/src/Controller/NumberOfSoldByParams.php @@ -0,0 +1,62 @@ +em = $em; + } + + private static $INTERVAL_DAY = 'day'; + private static $INTERVAL_MONTH = 'month'; + private static $INTERVAL_YEAR = 'year'; + + public function __invoke(Request $request, $interval, $start_date, $end_date) { + $query = " SELECT + TO_CHAR(valeurs_fonciere.date_mutation, 'YYYY') AS year, + TO_CHAR(valeurs_fonciere.date_mutation, 'MM') AS month, + COUNT(valeurs_fonciere.date_mutation) AS number_of_sold + FROM + App:ValeursFonciere AS valeurs_fonciere + WHERE + lower(valeurs_fonciere.nature_mutation) = 'vente' + AND + valeurs_fonciere.date_mutation >= TO_DATE('{$start_date}', 'DD-MM-YYYY') + AND + valeurs_fonciere.date_mutation <= TO_DATE('{$end_date}', 'DD-MM-YYYY') + GROUP BY + year, + month + ORDER BY + year, + month"; + $sold_houses = $this->em->createQuery($query)->getResult(); + foreach ($sold_houses as &$sold_house){ + $sold_house['year'] = intval($sold_house['year']); + $sold_house['month'] = intval($sold_house['month']); + $sold_house['number_of_sold'] = floatval($sold_house['number_of_sold']); + } + $res = new JsonResponse( + $sold_houses, + Response::HTTP_OK + ); + return $res; + } +} diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index 6e43474..ec32ec2 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -46,6 +46,81 @@ use Doctrine\ORM\Mapping as ORM; * "route_name"="mean_price_for_squared_meter", * "controller"=MeanPriceForSquaredMeter::class, * "pagination_enabled"=false, + * }, + * "numberofsoldbyparams"={ + * "method"="GET", + * "openapi_context"={ + * "summary"="Gets the number of sold houses by passed parameters", + * "produces"={ + * "application/json" + * }, + * "parameters"={ + * { + * "name"="interval", + * "in"="path", + * "schema"={ + * "type"= "string", + * "enum"={ + * "day", + * "month", + * "year" + * } + * }, + * "description"="The start date of the duration", + * "required"=true + * }, + * { + * "name"="start_date", + * "in"="path", + * "schema"={ + * "type"= "string" + * }, + * "description"="The start date of the duration", + * "required"=true, + * "example"="01-01-2015" + * }, + * { + * "name"="end_date", + * "in"="path", + * "schema"={ + * "type"= "string" + * }, + * "description"="The end date of the duration", + * "required"=true, + * "example"="01-06-2015" + * } + * }, + + * "responses"={ + * "200"={ + * "description"="Mean of squared meter price", + * "content"= { + * "application/json"={ + * "schema"={ + * "type"="array", + * "items"={ + * "type"="object", + * "properties"={ + * "year"={ + * "type"="number" + * }, + * "month"={ + * "type"="number" + * }, + * "mean_metre_price"={ + * "type"="number" + * } + * } + * } + * } + * } + * } + * } + * } + * }, + * "route_name"="number_of_sold_by_params", + * "controller"=NumberOfSoldByParams::class, + * "pagination_enabled"=false, * } * } * ) -- GitLab From db9f0d4bcc86d1f5354570d6e1f4867567167235 Mon Sep 17 00:00:00 2001 From: Radia Belkaid Date: Wed, 1 Jan 2020 12:39:14 +0100 Subject: [PATCH 07/11] Appliquer l'intervalle pour la route number-of-sold-by-params --- api/src/Controller/NumberOfSoldByParams.php | 35 ++++++++++++++++----- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/api/src/Controller/NumberOfSoldByParams.php b/api/src/Controller/NumberOfSoldByParams.php index 5f6c8fb..9dc07e8 100644 --- a/api/src/Controller/NumberOfSoldByParams.php +++ b/api/src/Controller/NumberOfSoldByParams.php @@ -29,9 +29,27 @@ class NumberOfSoldByParams extends AbstractController private static $INTERVAL_YEAR = 'year'; public function __invoke(Request $request, $interval, $start_date, $end_date) { + $selection = "TO_CHAR(valeurs_fonciere.date_mutation, 'YYYY') AS year"; + $groupByAndOrder = "year"; + if($interval == self::$INTERVAL_DAY){ + $selection .= ", + TO_CHAR(valeurs_fonciere.date_mutation, 'MM') AS month, + TO_CHAR(valeurs_fonciere.date_mutation, 'DD') AS day + "; + $groupByAndOrder .= ", + month, + day + "; + }elseif ($interval == self::$INTERVAL_MONTH){ + $selection .= ", + TO_CHAR(valeurs_fonciere.date_mutation, 'MM') AS month + "; + $groupByAndOrder .= ", + month + "; + } $query = " SELECT - TO_CHAR(valeurs_fonciere.date_mutation, 'YYYY') AS year, - TO_CHAR(valeurs_fonciere.date_mutation, 'MM') AS month, + {$selection}, COUNT(valeurs_fonciere.date_mutation) AS number_of_sold FROM App:ValeursFonciere AS valeurs_fonciere @@ -42,15 +60,18 @@ class NumberOfSoldByParams extends AbstractController AND valeurs_fonciere.date_mutation <= TO_DATE('{$end_date}', 'DD-MM-YYYY') GROUP BY - year, - month + {$groupByAndOrder} ORDER BY - year, - month"; + {$groupByAndOrder}"; $sold_houses = $this->em->createQuery($query)->getResult(); foreach ($sold_houses as &$sold_house){ $sold_house['year'] = intval($sold_house['year']); - $sold_house['month'] = intval($sold_house['month']); + if($interval == self::$INTERVAL_DAY){ + $sold_house['month'] = intval($sold_house['month']); + $sold_house['day'] = intval($sold_house['day']); + }elseif ($interval == self::$INTERVAL_MONTH){ + $sold_house['month'] = intval($sold_house['month']); + } $sold_house['number_of_sold'] = floatval($sold_house['number_of_sold']); } $res = new JsonResponse( -- GitLab From 9444ffc2b5f2e2a9d60741f99235f79a7da51f42 Mon Sep 17 00:00:00 2001 From: zm195643 Date: Wed, 1 Jan 2020 16:13:38 +0100 Subject: [PATCH 08/11] =?UTF-8?q?Ajout=20de=20'code=5Fdepartement'=20?= =?UTF-8?q?=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/DataFixtures/AppFixtures.php | 1 + api/src/Entity/ValeursFonciere.php | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/api/src/DataFixtures/AppFixtures.php b/api/src/DataFixtures/AppFixtures.php index bb4c25c..e10291e 100644 --- a/api/src/DataFixtures/AppFixtures.php +++ b/api/src/DataFixtures/AppFixtures.php @@ -49,6 +49,7 @@ class AppFixtures extends Fixture $valeursFonciere->setNatureMutation($row[9]); $valeursFonciere->setValeurFonciere(floatval(str_replace(',', '.', $row[10]))); $valeursFonciere->setCommune($row[17]); + $valeursFonciere->setCodeDepartement(intval($row[18])); $valeursFonciere->setCodeCommune(intval($row[19])); $valeursFonciere->setCodeTypeLocal(intval($row[35])); $valeursFonciere->setTypeLocal($row[36]); diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index ec32ec2..26bdc38 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -160,6 +160,11 @@ class ValeursFonciere */ private $commune; + /** + * @ORM\Column(type="integer") + */ + private $code_departement; + /** * @ORM\Column(type="integer") */ @@ -228,6 +233,18 @@ class ValeursFonciere return $this; } + public function getCodeDepartement(): ?int + { + return $this->code_departement; + } + + public function setCodeDepartement(int $code_departement): self + { + $this->code_departement = $code_departement; + + return $this; + } + public function getCommune(): ?string { return $this->commune; -- GitLab From 294f0f9bf1435566b404ac86b084c7f6c19fee96 Mon Sep 17 00:00:00 2001 From: zm195643 Date: Wed, 1 Jan 2020 17:36:41 +0100 Subject: [PATCH 09/11] Ajout de la route 'number-of-sold-by-region' --- api/src/Controller/NumberOfSoldByRegion.php | 50 +++++++++++++++++++++ api/src/Entity/ValeursFonciere.php | 35 +++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 api/src/Controller/NumberOfSoldByRegion.php diff --git a/api/src/Controller/NumberOfSoldByRegion.php b/api/src/Controller/NumberOfSoldByRegion.php new file mode 100644 index 0000000..50b423b --- /dev/null +++ b/api/src/Controller/NumberOfSoldByRegion.php @@ -0,0 +1,50 @@ +em = $em; + } + + public function __invoke(Request $request) { + $query = " SELECT + valeurs_fonciere.code_departement AS code_departement, + COUNT(valeurs_fonciere.code_departement) AS count_by_departement + FROM + App:ValeursFonciere AS valeurs_fonciere + WHERE + valeurs_fonciere.code_departement > 0 + AND + lower(valeurs_fonciere.nature_mutation) = 'vente' + GROUP BY + valeurs_fonciere.code_departement"; + $counts_by_departement = $this->em->createQuery($query)->getResult(); + foreach ($counts_by_departement as &$count_by_departement){ + $count_by_departement['code_departement'] = intval($count_by_departement['code_departement']); + $count_by_departement['count_by_departement'] = intval($count_by_departement['count_by_departement']); + } + $res = new JsonResponse( + $counts_by_departement, + Response::HTTP_OK + ); + return $res; + } +} diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index 26bdc38..ff63d06 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -121,6 +121,41 @@ use Doctrine\ORM\Mapping as ORM; * "route_name"="number_of_sold_by_params", * "controller"=NumberOfSoldByParams::class, * "pagination_enabled"=false, + * }, + * "numberofsoldbyregion"={ + * "method"="GET", + * "openapi_context"={ + * "summary"="Gets the number of sold items by region", + * "produces"={ + * "application/json" + * }, + * "responses"={ + * "200"={ + * "description"="Number of sold items by region", + * "content"= { + * "application/json"={ + * "schema"={ + * "type"="array", + * "items"={ + * "type"="object", + * "properties"={ + * "region"={ + * "type"="string" + * }, + * "count_by_region"={ + * "type"="number" + * } + * } + * } + * } + * } + * } + * } + * } + * }, + * "route_name"="number_of_sold_by_region", + * "controller"=NumberOfSoldByRegion::class, + * "pagination_enabled"=false, * } * } * ) -- GitLab From 19233ccbe10aa525c3d36ff4d88a59e3b26c9a50 Mon Sep 17 00:00:00 2001 From: zm195643 Date: Wed, 1 Jan 2020 18:46:44 +0100 Subject: [PATCH 10/11] =?UTF-8?q?Ajout=20les=20region=20=C3=A0=20la=20rout?= =?UTF-8?q?e=20'number-of-sold-by-region'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/Controller/NumberOfSoldByRegion.php | 51 +++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/api/src/Controller/NumberOfSoldByRegion.php b/api/src/Controller/NumberOfSoldByRegion.php index 50b423b..34f2b93 100644 --- a/api/src/Controller/NumberOfSoldByRegion.php +++ b/api/src/Controller/NumberOfSoldByRegion.php @@ -5,6 +5,7 @@ namespace App\Controller; use Doctrine\ORM\EntityManagerInterface; +use phpDocumentor\Reflection\Types\Self_; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; @@ -24,6 +25,26 @@ class NumberOfSoldByRegion extends AbstractController $this->em = $em; } + private static $REGIONS = [ + 'Auvergne-Rhône-Alpes' => [3,15,43,63,1,7,26,38,42,69,73,74], + 'Normandie' => [14,50,61,27,76], + 'Bourgogne-Franche-Comté' => [21,58,71,89,25,39,70,90], + 'Bretagne' => [22,29,35,56], + 'Centre-Val de Loire' => [18,28,36,37,41,45], + 'Grand Est' => [8,10,51,52,54,55,57,88,67,68], + 'Ile-de-France' => [75,77,78,91,92,93,94,95], + 'Occitanie' => [11,30,34,48,66,9,12,31,32,46,65,81,82], + 'Hauts-de-France' => [59,62,2,60,80], + 'Pays de la Loire' => [44,49,53,72,85], + 'Nouvelle-Aquitaine' => [16,17,79,86,19,23,87,24,33,40,47,64], + 'Provence-Alpes-Côte-d\'Azur' => [4,5,6,13,83,84], + 'Guadeloupe' => [971], + 'Martinique' => [972], + 'Guyane' => [973], + 'La Réunion' => [974], + 'Mayotte' => [976] + ]; + public function __invoke(Request $request) { $query = " SELECT valeurs_fonciere.code_departement AS code_departement, @@ -34,17 +55,41 @@ class NumberOfSoldByRegion extends AbstractController valeurs_fonciere.code_departement > 0 AND lower(valeurs_fonciere.nature_mutation) = 'vente' - GROUP BY + GROUP BY valeurs_fonciere.code_departement"; $counts_by_departement = $this->em->createQuery($query)->getResult(); - foreach ($counts_by_departement as &$count_by_departement){ + $counts_by_region = []; + foreach ($counts_by_departement as $count_by_departement){ $count_by_departement['code_departement'] = intval($count_by_departement['code_departement']); $count_by_departement['count_by_departement'] = intval($count_by_departement['count_by_departement']); + $region = $this->getRegionByDepartement($count_by_departement['code_departement']); + if($region){ + if(!key_exists($region, $counts_by_region)){ + $counts_by_region[$region] = 0; + } + $counts_by_region[$region] += $count_by_departement['count_by_departement']; + } + } + $counts_by_region_fixed = []; + foreach ($counts_by_region as $region_name => $count_by_region){ + $counts_by_region_fixed[] = [ + 'region' => $region_name, + 'count_by_region' => $count_by_region + ]; } $res = new JsonResponse( - $counts_by_departement, + $counts_by_region_fixed, Response::HTTP_OK ); return $res; } + + private function getRegionByDepartement($departement){ + foreach (self::$REGIONS as $region_name => $region_departements){ + if(array_search($departement,$region_departements,true) !== false){ + return $region_name; + } + } + return false; + } } -- GitLab From 487f233980618cd2b653a7703d86df00f078a423 Mon Sep 17 00:00:00 2001 From: zm195643 Date: Wed, 1 Jan 2020 18:54:03 +0100 Subject: [PATCH 11/11] Fixer la documentation de 'number-of-sold-by-params' --- api/src/Entity/ValeursFonciere.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/src/Entity/ValeursFonciere.php b/api/src/Entity/ValeursFonciere.php index ff63d06..9a654f7 100644 --- a/api/src/Entity/ValeursFonciere.php +++ b/api/src/Entity/ValeursFonciere.php @@ -98,6 +98,7 @@ use Doctrine\ORM\Mapping as ORM; * "application/json"={ * "schema"={ * "type"="array", + * "required"={"year", "mean_metre_price"}, * "items"={ * "type"="object", * "properties"={ @@ -107,6 +108,9 @@ use Doctrine\ORM\Mapping as ORM; * "month"={ * "type"="number" * }, + * "day"={ + * "type"="number" + * }, * "mean_metre_price"={ * "type"="number" * } -- GitLab