1*8add1155SRico Sonntag<?php 2*8add1155SRico Sonntag/** 3*8add1155SRico Sonntag * webtrees: online genealogy 4*8add1155SRico Sonntag * Copyright (C) 2018 webtrees development team 5*8add1155SRico Sonntag * This program is free software: you can redistribute it and/or modify 6*8add1155SRico Sonntag * it under the terms of the GNU General Public License as published by 7*8add1155SRico Sonntag * the Free Software Foundation, either version 3 of the License, or 8*8add1155SRico Sonntag * (at your option) any later version. 9*8add1155SRico Sonntag * This program is distributed in the hope that it will be useful, 10*8add1155SRico Sonntag * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*8add1155SRico Sonntag * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*8add1155SRico Sonntag * GNU General Public License for more details. 13*8add1155SRico Sonntag * You should have received a copy of the GNU General Public License 14*8add1155SRico Sonntag * along with this program. If not, see <http://www.gnu.org/licenses/>. 15*8add1155SRico Sonntag */ 16*8add1155SRico Sonntagdeclare(strict_types=1); 17*8add1155SRico Sonntag 18*8add1155SRico Sonntagnamespace Fisharebest\Webtrees\Statistics\Repository; 19*8add1155SRico Sonntag 20*8add1155SRico Sonntaguse Fisharebest\Webtrees\Date; 21*8add1155SRico Sonntaguse Fisharebest\Webtrees\GedcomRecord; 22*8add1155SRico Sonntaguse Fisharebest\Webtrees\Statistics\Repository\Interfaces\GedcomRepositoryInterface; 23*8add1155SRico Sonntaguse Fisharebest\Webtrees\Tree; 24*8add1155SRico Sonntaguse Illuminate\Database\Capsule\Manager as DB; 25*8add1155SRico Sonntaguse Illuminate\Database\Query\Builder; 26*8add1155SRico Sonntag 27*8add1155SRico Sonntag/** 28*8add1155SRico Sonntag * A repository providing methods for GEDCOM related statistics. 29*8add1155SRico Sonntag */ 30*8add1155SRico Sonntagclass GedcomRepository implements GedcomRepositoryInterface 31*8add1155SRico Sonntag{ 32*8add1155SRico Sonntag /** 33*8add1155SRico Sonntag * @var Tree 34*8add1155SRico Sonntag */ 35*8add1155SRico Sonntag private $tree; 36*8add1155SRico Sonntag 37*8add1155SRico Sonntag /** 38*8add1155SRico Sonntag * Constructor. 39*8add1155SRico Sonntag * 40*8add1155SRico Sonntag * @param Tree $tree 41*8add1155SRico Sonntag */ 42*8add1155SRico Sonntag public function __construct(Tree $tree) 43*8add1155SRico Sonntag { 44*8add1155SRico Sonntag $this->tree = $tree; 45*8add1155SRico Sonntag } 46*8add1155SRico Sonntag 47*8add1155SRico Sonntag /** 48*8add1155SRico Sonntag * Get information from the GEDCOM's HEAD record. 49*8add1155SRico Sonntag * 50*8add1155SRico Sonntag * @return string[] 51*8add1155SRico Sonntag */ 52*8add1155SRico Sonntag private function gedcomHead(): array 53*8add1155SRico Sonntag { 54*8add1155SRico Sonntag $title = ''; 55*8add1155SRico Sonntag $version = ''; 56*8add1155SRico Sonntag $source = ''; 57*8add1155SRico Sonntag 58*8add1155SRico Sonntag $head = GedcomRecord::getInstance('HEAD', $this->tree); 59*8add1155SRico Sonntag 60*8add1155SRico Sonntag if ($head !== null) { 61*8add1155SRico Sonntag $sour = $head->getFirstFact('SOUR'); 62*8add1155SRico Sonntag 63*8add1155SRico Sonntag if ($sour !== null) { 64*8add1155SRico Sonntag $source = $sour->value(); 65*8add1155SRico Sonntag $title = $sour->attribute('NAME'); 66*8add1155SRico Sonntag $version = $sour->attribute('VERS'); 67*8add1155SRico Sonntag } 68*8add1155SRico Sonntag } 69*8add1155SRico Sonntag 70*8add1155SRico Sonntag return [ 71*8add1155SRico Sonntag $title, 72*8add1155SRico Sonntag $version, 73*8add1155SRico Sonntag $source, 74*8add1155SRico Sonntag ]; 75*8add1155SRico Sonntag } 76*8add1155SRico Sonntag 77*8add1155SRico Sonntag /** 78*8add1155SRico Sonntag * @inheritDoc 79*8add1155SRico Sonntag */ 80*8add1155SRico Sonntag public function gedcomFilename(): string 81*8add1155SRico Sonntag { 82*8add1155SRico Sonntag return $this->tree->name(); 83*8add1155SRico Sonntag } 84*8add1155SRico Sonntag 85*8add1155SRico Sonntag /** 86*8add1155SRico Sonntag * @inheritDoc 87*8add1155SRico Sonntag */ 88*8add1155SRico Sonntag public function gedcomId(): int 89*8add1155SRico Sonntag { 90*8add1155SRico Sonntag return $this->tree->id(); 91*8add1155SRico Sonntag } 92*8add1155SRico Sonntag 93*8add1155SRico Sonntag /** 94*8add1155SRico Sonntag * @inheritDoc 95*8add1155SRico Sonntag */ 96*8add1155SRico Sonntag public function gedcomTitle(): string 97*8add1155SRico Sonntag { 98*8add1155SRico Sonntag return e($this->tree->title()); 99*8add1155SRico Sonntag } 100*8add1155SRico Sonntag 101*8add1155SRico Sonntag /** 102*8add1155SRico Sonntag * @inheritDoc 103*8add1155SRico Sonntag */ 104*8add1155SRico Sonntag public function gedcomCreatedSoftware(): string 105*8add1155SRico Sonntag { 106*8add1155SRico Sonntag return $this->gedcomHead()[0]; 107*8add1155SRico Sonntag } 108*8add1155SRico Sonntag 109*8add1155SRico Sonntag /** 110*8add1155SRico Sonntag * @inheritDoc 111*8add1155SRico Sonntag */ 112*8add1155SRico Sonntag public function gedcomCreatedVersion(): string 113*8add1155SRico Sonntag { 114*8add1155SRico Sonntag $head = $this->gedcomHead(); 115*8add1155SRico Sonntag 116*8add1155SRico Sonntag if ($head === null) { 117*8add1155SRico Sonntag return ''; 118*8add1155SRico Sonntag } 119*8add1155SRico Sonntag 120*8add1155SRico Sonntag // Fix broken version string in Family Tree Maker 121*8add1155SRico Sonntag if (strpos($head[1], 'Family Tree Maker ') !== false) { 122*8add1155SRico Sonntag $p = strpos($head[1], '(') + 1; 123*8add1155SRico Sonntag $p2 = strpos($head[1], ')'); 124*8add1155SRico Sonntag $head[1] = substr($head[1], $p, $p2 - $p); 125*8add1155SRico Sonntag } 126*8add1155SRico Sonntag 127*8add1155SRico Sonntag // Fix EasyTree version 128*8add1155SRico Sonntag if ($head[2] === 'EasyTree') { 129*8add1155SRico Sonntag $head[1] = substr($head[1], 1); 130*8add1155SRico Sonntag } 131*8add1155SRico Sonntag 132*8add1155SRico Sonntag return $head[1]; 133*8add1155SRico Sonntag } 134*8add1155SRico Sonntag 135*8add1155SRico Sonntag /** 136*8add1155SRico Sonntag * @inheritDoc 137*8add1155SRico Sonntag */ 138*8add1155SRico Sonntag public function gedcomDate(): string 139*8add1155SRico Sonntag { 140*8add1155SRico Sonntag $head = GedcomRecord::getInstance('HEAD', $this->tree); 141*8add1155SRico Sonntag 142*8add1155SRico Sonntag if ($head !== null) { 143*8add1155SRico Sonntag $fact = $head->getFirstFact('DATE'); 144*8add1155SRico Sonntag 145*8add1155SRico Sonntag if ($fact) { 146*8add1155SRico Sonntag return (new Date($fact->value()))->display(); 147*8add1155SRico Sonntag } 148*8add1155SRico Sonntag } 149*8add1155SRico Sonntag 150*8add1155SRico Sonntag return ''; 151*8add1155SRico Sonntag } 152*8add1155SRico Sonntag 153*8add1155SRico Sonntag /** 154*8add1155SRico Sonntag * @inheritDoc 155*8add1155SRico Sonntag */ 156*8add1155SRico Sonntag public function gedcomUpdated(): string 157*8add1155SRico Sonntag { 158*8add1155SRico Sonntag $row = DB::table('dates') 159*8add1155SRico Sonntag ->select(['d_year', 'd_month', 'd_day']) 160*8add1155SRico Sonntag ->where('d_julianday1', '=', function (Builder $query) { 161*8add1155SRico Sonntag $query->selectRaw('MAX(d_julianday1)') 162*8add1155SRico Sonntag ->from('dates') 163*8add1155SRico Sonntag ->where('d_file', '=', $this->tree->id()) 164*8add1155SRico Sonntag ->where('d_fact', '=', 'CHAN'); 165*8add1155SRico Sonntag }) 166*8add1155SRico Sonntag ->first(); 167*8add1155SRico Sonntag 168*8add1155SRico Sonntag if ($row) { 169*8add1155SRico Sonntag $date = new Date("{$row->d_day} {$row->d_month} {$row->d_year}"); 170*8add1155SRico Sonntag return $date->display(); 171*8add1155SRico Sonntag } 172*8add1155SRico Sonntag 173*8add1155SRico Sonntag return $this->gedcomDate(); 174*8add1155SRico Sonntag } 175*8add1155SRico Sonntag 176*8add1155SRico Sonntag /** 177*8add1155SRico Sonntag * @inheritDoc 178*8add1155SRico Sonntag */ 179*8add1155SRico Sonntag public function gedcomRootId(): string 180*8add1155SRico Sonntag { 181*8add1155SRico Sonntag return $this->tree->getPreference('PEDIGREE_ROOT_ID'); 182*8add1155SRico Sonntag } 183*8add1155SRico Sonntag} 184