18add1155SRico Sonntag<?php 28add1155SRico Sonntag/** 38add1155SRico Sonntag * webtrees: online genealogy 48add1155SRico Sonntag * Copyright (C) 2018 webtrees development team 58add1155SRico Sonntag * This program is free software: you can redistribute it and/or modify 68add1155SRico Sonntag * it under the terms of the GNU General Public License as published by 78add1155SRico Sonntag * the Free Software Foundation, either version 3 of the License, or 88add1155SRico Sonntag * (at your option) any later version. 98add1155SRico Sonntag * This program is distributed in the hope that it will be useful, 108add1155SRico Sonntag * but WITHOUT ANY WARRANTY; without even the implied warranty of 118add1155SRico Sonntag * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 128add1155SRico Sonntag * GNU General Public License for more details. 138add1155SRico Sonntag * You should have received a copy of the GNU General Public License 148add1155SRico Sonntag * along with this program. If not, see <http://www.gnu.org/licenses/>. 158add1155SRico Sonntag */ 168add1155SRico Sonntagdeclare(strict_types=1); 178add1155SRico Sonntag 188add1155SRico Sonntagnamespace Fisharebest\Webtrees\Statistics\Google; 198add1155SRico Sonntag 208add1155SRico Sonntaguse Fisharebest\Webtrees\I18N; 218add1155SRico Sonntaguse Fisharebest\Webtrees\Statistics\AbstractGoogle; 228add1155SRico Sonntaguse Fisharebest\Webtrees\Statistics\Helper\Century; 238add1155SRico Sonntaguse Fisharebest\Webtrees\Tree; 248add1155SRico Sonntaguse Illuminate\Database\Capsule\Manager as DB; 258add1155SRico Sonntaguse Illuminate\Database\Query\JoinClause; 268add1155SRico Sonntag 278add1155SRico Sonntag/** 288add1155SRico Sonntag * 298add1155SRico Sonntag */ 308add1155SRico Sonntagclass ChartChildren extends AbstractGoogle 318add1155SRico Sonntag{ 328add1155SRico Sonntag /** 338add1155SRico Sonntag * @var Tree 348add1155SRico Sonntag */ 358add1155SRico Sonntag private $tree; 368add1155SRico Sonntag 378add1155SRico Sonntag /** 388add1155SRico Sonntag * @var Century 398add1155SRico Sonntag */ 408add1155SRico Sonntag private $centuryHelper; 418add1155SRico Sonntag 428add1155SRico Sonntag /** 438add1155SRico Sonntag * Constructor. 448add1155SRico Sonntag * 458add1155SRico Sonntag * @param Tree $tree 468add1155SRico Sonntag */ 478add1155SRico Sonntag public function __construct(Tree $tree) 488add1155SRico Sonntag { 498add1155SRico Sonntag $this->tree = $tree; 508add1155SRico Sonntag $this->centuryHelper = new Century(); 518add1155SRico Sonntag } 528add1155SRico Sonntag 538add1155SRico Sonntag /** 548add1155SRico Sonntag * Returns the related database records. 558add1155SRico Sonntag * 568add1155SRico Sonntag * @return \stdClass[] 578add1155SRico Sonntag */ 588add1155SRico Sonntag private function queryRecords(): array 598add1155SRico Sonntag { 608add1155SRico Sonntag $query = DB::table('families') 618add1155SRico Sonntag ->selectRaw('ROUND(AVG(f_numchil),2) AS num') 62*3dc8167dSGreg Roach ->selectRaw('ROUND((d_year - 50) / 100) AS century') 638add1155SRico Sonntag ->join('dates', function (JoinClause $join) { 648add1155SRico Sonntag $join->on('d_file', '=', 'f_file') 658add1155SRico Sonntag ->on('d_gid', '=', 'f_id'); 668add1155SRico Sonntag }) 678add1155SRico Sonntag ->where('f_file', '=', $this->tree->id()) 688add1155SRico Sonntag ->where('d_julianday1', '<>', 0) 698add1155SRico Sonntag ->where('d_fact', '=', 'MARR') 708add1155SRico Sonntag ->whereIn('d_type', ['@#DGREGORIAN@', '@#DJULIAN@']) 718add1155SRico Sonntag ->groupBy(['century']) 728add1155SRico Sonntag ->orderBy('century'); 738add1155SRico Sonntag 748add1155SRico Sonntag return $query->get()->all(); 758add1155SRico Sonntag } 768add1155SRico Sonntag 778add1155SRico Sonntag /** 788add1155SRico Sonntag * General query on familes/children. 798add1155SRico Sonntag * 808add1155SRico Sonntag * @param string $size 818add1155SRico Sonntag * 828add1155SRico Sonntag * @return string 838add1155SRico Sonntag */ 848add1155SRico Sonntag public function chartChildren(string $size = '220x200'): string 858add1155SRico Sonntag { 868add1155SRico Sonntag $sizes = explode('x', $size); 878add1155SRico Sonntag $max = 0; 888add1155SRico Sonntag $rows = $this->queryRecords(); 898add1155SRico Sonntag 908add1155SRico Sonntag if (empty($rows)) { 918add1155SRico Sonntag return ''; 928add1155SRico Sonntag } 938add1155SRico Sonntag 948add1155SRico Sonntag foreach ($rows as $values) { 958add1155SRico Sonntag $values->num = (int) $values->num; 968add1155SRico Sonntag if ($max < $values->num) { 978add1155SRico Sonntag $max = $values->num; 988add1155SRico Sonntag } 998add1155SRico Sonntag } 1008add1155SRico Sonntag 1018add1155SRico Sonntag $chm = ''; 1028add1155SRico Sonntag $chxl = '0:|'; 1038add1155SRico Sonntag $i = 0; 1048add1155SRico Sonntag $counts = []; 1058add1155SRico Sonntag 1068add1155SRico Sonntag foreach ($rows as $values) { 1078add1155SRico Sonntag $chxl .= $this->centuryHelper->centuryName((int) $values->century) . '|'; 1088add1155SRico Sonntag if ($max <= 5) { 1098add1155SRico Sonntag $counts[] = (int) ($values->num * 819.2 - 1); 1108add1155SRico Sonntag } elseif ($max <= 10) { 1118add1155SRico Sonntag $counts[] = (int) ($values->num * 409.6); 1128add1155SRico Sonntag } else { 1138add1155SRico Sonntag $counts[] = (int) ($values->num * 204.8); 1148add1155SRico Sonntag } 1158add1155SRico Sonntag $chm .= 't' . $values->num . ',000000,0,' . $i . ',11,1|'; 1168add1155SRico Sonntag $i++; 1178add1155SRico Sonntag } 1188add1155SRico Sonntag 1198add1155SRico Sonntag $chd = $this->arrayToExtendedEncoding($counts); 1208add1155SRico Sonntag $chm = substr($chm, 0, -1); 1218add1155SRico Sonntag 1228add1155SRico Sonntag if ($max <= 5) { 1238add1155SRico Sonntag $chxl .= '1:||' . I18N::translate('century') . '|2:|0|1|2|3|4|5|3:||' . I18N::translate('Number of children') . '|'; 1248add1155SRico Sonntag } elseif ($max <= 10) { 1258add1155SRico Sonntag $chxl .= '1:||' . I18N::translate('century') . '|2:|0|1|2|3|4|5|6|7|8|9|10|3:||' . I18N::translate('Number of children') . '|'; 1268add1155SRico Sonntag } else { 1278add1155SRico Sonntag $chxl .= '1:||' . I18N::translate('century') . '|2:|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|3:||' . I18N::translate('Number of children') . '|'; 1288add1155SRico Sonntag } 1298add1155SRico Sonntag 1308add1155SRico Sonntag $chart_url = 'https://chart.googleapis.com/chart?cht=bvg&chs=' . $sizes[0] . 'x' . $sizes[1] 1318add1155SRico Sonntag . '&chf=bg,s,ffffff00|c,s,ffffff00&chm=D,FF0000,0,0,3,1|' . $chm 1328add1155SRico Sonntag . '&chd=e:' . $chd . '&chco=0000FF&chbh=30,3&chxt=x,x,y,y&chxl=' 1338add1155SRico Sonntag . rawurlencode($chxl); 1348add1155SRico Sonntag 1358add1155SRico Sonntag return view( 1368add1155SRico Sonntag 'statistics/other/chart-google', 1378add1155SRico Sonntag [ 1388add1155SRico Sonntag 'chart_title' => I18N::translate('Average number of children per family'), 1398add1155SRico Sonntag 'chart_url' => $chart_url, 1408add1155SRico Sonntag 'sizes' => $sizes, 1418add1155SRico Sonntag ] 1428add1155SRico Sonntag ); 1438add1155SRico Sonntag } 1448add1155SRico Sonntag} 145