1*5bbfbb82SGreg Roach<?php 2*5bbfbb82SGreg Roach 3*5bbfbb82SGreg Roach/** 4*5bbfbb82SGreg Roach * webtrees: online genealogy 5*5bbfbb82SGreg Roach * Copyright (C) 2019 webtrees development team 6*5bbfbb82SGreg Roach * This program is free software: you can redistribute it and/or modify 7*5bbfbb82SGreg Roach * it under the terms of the GNU General Public License as published by 8*5bbfbb82SGreg Roach * the Free Software Foundation, either version 3 of the License, or 9*5bbfbb82SGreg Roach * (at your option) any later version. 10*5bbfbb82SGreg Roach * This program is distributed in the hope that it will be useful, 11*5bbfbb82SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*5bbfbb82SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*5bbfbb82SGreg Roach * GNU General Public License for more details. 14*5bbfbb82SGreg Roach * You should have received a copy of the GNU General Public License 15*5bbfbb82SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>. 16*5bbfbb82SGreg Roach */ 17*5bbfbb82SGreg Roach 18*5bbfbb82SGreg Roachdeclare(strict_types=1); 19*5bbfbb82SGreg Roach 20*5bbfbb82SGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers; 21*5bbfbb82SGreg Roach 22*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Family; 23*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\GedcomRecord; 24*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Http\ViewResponseTrait; 25*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\I18N; 26*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Individual; 27*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Media; 28*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Note; 29*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Repository; 30*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Source; 31*5bbfbb82SGreg Roachuse Fisharebest\Webtrees\Tree; 32*5bbfbb82SGreg Roachuse Psr\Http\Message\ResponseInterface; 33*5bbfbb82SGreg Roachuse Psr\Http\Message\ServerRequestInterface; 34*5bbfbb82SGreg Roachuse Psr\Http\Server\RequestHandlerInterface; 35*5bbfbb82SGreg Roach 36*5bbfbb82SGreg Roachuse function assert; 37*5bbfbb82SGreg Roachuse function redirect; 38*5bbfbb82SGreg Roach 39*5bbfbb82SGreg Roach/** 40*5bbfbb82SGreg Roach * Merge records 41*5bbfbb82SGreg Roach */ 42*5bbfbb82SGreg Roachclass MergeFactsPage implements RequestHandlerInterface 43*5bbfbb82SGreg Roach{ 44*5bbfbb82SGreg Roach use ViewResponseTrait; 45*5bbfbb82SGreg Roach 46*5bbfbb82SGreg Roach /** 47*5bbfbb82SGreg Roach * Merge two genealogy records. 48*5bbfbb82SGreg Roach * 49*5bbfbb82SGreg Roach * @param ServerRequestInterface $request 50*5bbfbb82SGreg Roach * 51*5bbfbb82SGreg Roach * @return ResponseInterface 52*5bbfbb82SGreg Roach */ 53*5bbfbb82SGreg Roach public function handle(ServerRequestInterface $request): ResponseInterface 54*5bbfbb82SGreg Roach { 55*5bbfbb82SGreg Roach $this->layout = 'layouts/administration'; 56*5bbfbb82SGreg Roach 57*5bbfbb82SGreg Roach $tree = $request->getAttribute('tree'); 58*5bbfbb82SGreg Roach assert($tree instanceof Tree); 59*5bbfbb82SGreg Roach 60*5bbfbb82SGreg Roach $xref1 = $request->getQueryParams()['xref1'] ?? ''; 61*5bbfbb82SGreg Roach $xref2 = $request->getQueryParams()['xref2'] ?? ''; 62*5bbfbb82SGreg Roach 63*5bbfbb82SGreg Roach $title = I18N::translate('Merge records') . ' — ' . e($tree->title()); 64*5bbfbb82SGreg Roach 65*5bbfbb82SGreg Roach $record1 = GedcomRecord::getInstance($xref1, $tree); 66*5bbfbb82SGreg Roach $record2 = GedcomRecord::getInstance($xref2, $tree); 67*5bbfbb82SGreg Roach 68*5bbfbb82SGreg Roach if ( 69*5bbfbb82SGreg Roach $record1 === null || 70*5bbfbb82SGreg Roach $record2 === null || 71*5bbfbb82SGreg Roach $record1 === $record2 || 72*5bbfbb82SGreg Roach $record1::RECORD_TYPE !== $record2::RECORD_TYPE || 73*5bbfbb82SGreg Roach $record1->isPendingDeletion() || 74*5bbfbb82SGreg Roach $record2->isPendingDeletion() 75*5bbfbb82SGreg Roach ) { 76*5bbfbb82SGreg Roach return redirect(route(MergeRecordsPage::class, [ 77*5bbfbb82SGreg Roach 'tree' => $tree->name(), 78*5bbfbb82SGreg Roach 'xref1' => $xref1, 79*5bbfbb82SGreg Roach 'xref2' => $xref2, 80*5bbfbb82SGreg Roach ])); 81*5bbfbb82SGreg Roach } 82*5bbfbb82SGreg Roach 83*5bbfbb82SGreg Roach // Facts found both records 84*5bbfbb82SGreg Roach $facts = []; 85*5bbfbb82SGreg Roach 86*5bbfbb82SGreg Roach // Facts found in only one record 87*5bbfbb82SGreg Roach $facts1 = []; 88*5bbfbb82SGreg Roach $facts2 = []; 89*5bbfbb82SGreg Roach 90*5bbfbb82SGreg Roach foreach ($record1->facts() as $fact) { 91*5bbfbb82SGreg Roach if (!$fact->isPendingDeletion() && $fact->getTag() !== 'CHAN') { 92*5bbfbb82SGreg Roach $facts1[$fact->id()] = $fact; 93*5bbfbb82SGreg Roach } 94*5bbfbb82SGreg Roach } 95*5bbfbb82SGreg Roach 96*5bbfbb82SGreg Roach foreach ($record2->facts() as $fact) { 97*5bbfbb82SGreg Roach if (!$fact->isPendingDeletion() && $fact->getTag() !== 'CHAN') { 98*5bbfbb82SGreg Roach $facts2[$fact->id()] = $fact; 99*5bbfbb82SGreg Roach } 100*5bbfbb82SGreg Roach } 101*5bbfbb82SGreg Roach 102*5bbfbb82SGreg Roach foreach ($facts1 as $id1 => $fact1) { 103*5bbfbb82SGreg Roach foreach ($facts2 as $id2 => $fact2) { 104*5bbfbb82SGreg Roach if ($fact1->id() === $fact2->id()) { 105*5bbfbb82SGreg Roach $facts[] = $fact1; 106*5bbfbb82SGreg Roach unset($facts1[$id1], $facts2[$id2]); 107*5bbfbb82SGreg Roach } 108*5bbfbb82SGreg Roach } 109*5bbfbb82SGreg Roach } 110*5bbfbb82SGreg Roach 111*5bbfbb82SGreg Roach return $this->viewResponse('admin/merge-records-step-2', [ 112*5bbfbb82SGreg Roach 'facts' => $facts, 113*5bbfbb82SGreg Roach 'facts1' => $facts1, 114*5bbfbb82SGreg Roach 'facts2' => $facts2, 115*5bbfbb82SGreg Roach 'record1' => $record1, 116*5bbfbb82SGreg Roach 'record2' => $record2, 117*5bbfbb82SGreg Roach 'title' => $title, 118*5bbfbb82SGreg Roach 'tree' => $tree, 119*5bbfbb82SGreg Roach ]); 120*5bbfbb82SGreg Roach } 121*5bbfbb82SGreg Roach} 122