15bbfbb82SGreg Roach<?php 25bbfbb82SGreg Roach 35bbfbb82SGreg Roach/** 45bbfbb82SGreg Roach * webtrees: online genealogy 5*89f7189bSGreg Roach * Copyright (C) 2021 webtrees development team 65bbfbb82SGreg Roach * This program is free software: you can redistribute it and/or modify 75bbfbb82SGreg Roach * it under the terms of the GNU General Public License as published by 85bbfbb82SGreg Roach * the Free Software Foundation, either version 3 of the License, or 95bbfbb82SGreg Roach * (at your option) any later version. 105bbfbb82SGreg Roach * This program is distributed in the hope that it will be useful, 115bbfbb82SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 125bbfbb82SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 135bbfbb82SGreg Roach * GNU General Public License for more details. 145bbfbb82SGreg Roach * You should have received a copy of the GNU General Public License 15*89f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>. 165bbfbb82SGreg Roach */ 175bbfbb82SGreg Roach 185bbfbb82SGreg Roachdeclare(strict_types=1); 195bbfbb82SGreg Roach 205bbfbb82SGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers; 215bbfbb82SGreg Roach 225bbfbb82SGreg Roachuse Fisharebest\Webtrees\Http\ViewResponseTrait; 235bbfbb82SGreg Roachuse Fisharebest\Webtrees\I18N; 246b9cb339SGreg Roachuse Fisharebest\Webtrees\Registry; 255bbfbb82SGreg Roachuse Fisharebest\Webtrees\Tree; 265bbfbb82SGreg Roachuse Psr\Http\Message\ResponseInterface; 275bbfbb82SGreg Roachuse Psr\Http\Message\ServerRequestInterface; 285bbfbb82SGreg Roachuse Psr\Http\Server\RequestHandlerInterface; 295bbfbb82SGreg Roach 305bbfbb82SGreg Roachuse function assert; 315bbfbb82SGreg Roachuse function redirect; 325bbfbb82SGreg Roach 335bbfbb82SGreg Roach/** 345bbfbb82SGreg Roach * Merge records 355bbfbb82SGreg Roach */ 365bbfbb82SGreg Roachclass MergeFactsPage implements RequestHandlerInterface 375bbfbb82SGreg Roach{ 385bbfbb82SGreg Roach use ViewResponseTrait; 395bbfbb82SGreg Roach 405bbfbb82SGreg Roach /** 415bbfbb82SGreg Roach * Merge two genealogy records. 425bbfbb82SGreg Roach * 435bbfbb82SGreg Roach * @param ServerRequestInterface $request 445bbfbb82SGreg Roach * 455bbfbb82SGreg Roach * @return ResponseInterface 465bbfbb82SGreg Roach */ 475bbfbb82SGreg Roach public function handle(ServerRequestInterface $request): ResponseInterface 485bbfbb82SGreg Roach { 495bbfbb82SGreg Roach $this->layout = 'layouts/administration'; 505bbfbb82SGreg Roach 515bbfbb82SGreg Roach $tree = $request->getAttribute('tree'); 525bbfbb82SGreg Roach assert($tree instanceof Tree); 535bbfbb82SGreg Roach 545bbfbb82SGreg Roach $xref1 = $request->getQueryParams()['xref1'] ?? ''; 555bbfbb82SGreg Roach $xref2 = $request->getQueryParams()['xref2'] ?? ''; 565bbfbb82SGreg Roach 575bbfbb82SGreg Roach $title = I18N::translate('Merge records') . ' — ' . e($tree->title()); 585bbfbb82SGreg Roach 596b9cb339SGreg Roach $record1 = Registry::gedcomRecordFactory()->make($xref1, $tree); 606b9cb339SGreg Roach $record2 = Registry::gedcomRecordFactory()->make($xref2, $tree); 615bbfbb82SGreg Roach 625bbfbb82SGreg Roach if ( 635bbfbb82SGreg Roach $record1 === null || 645bbfbb82SGreg Roach $record2 === null || 655bbfbb82SGreg Roach $record1 === $record2 || 6602467d32SGreg Roach $record1->tag() !== $record2->tag() || 675bbfbb82SGreg Roach $record1->isPendingDeletion() || 685bbfbb82SGreg Roach $record2->isPendingDeletion() 695bbfbb82SGreg Roach ) { 705bbfbb82SGreg Roach return redirect(route(MergeRecordsPage::class, [ 715bbfbb82SGreg Roach 'tree' => $tree->name(), 725bbfbb82SGreg Roach 'xref1' => $xref1, 735bbfbb82SGreg Roach 'xref2' => $xref2, 745bbfbb82SGreg Roach ])); 755bbfbb82SGreg Roach } 765bbfbb82SGreg Roach 775bbfbb82SGreg Roach // Facts found both records 785bbfbb82SGreg Roach $facts = []; 795bbfbb82SGreg Roach 805bbfbb82SGreg Roach // Facts found in only one record 815bbfbb82SGreg Roach $facts1 = []; 825bbfbb82SGreg Roach $facts2 = []; 835bbfbb82SGreg Roach 845bbfbb82SGreg Roach foreach ($record1->facts() as $fact) { 857fe676e5SGreg Roach if (!$fact->isPendingDeletion() && $fact->getTag() !== 'CHAN') { 865bbfbb82SGreg Roach $facts1[$fact->id()] = $fact; 875bbfbb82SGreg Roach } 885bbfbb82SGreg Roach } 895bbfbb82SGreg Roach 905bbfbb82SGreg Roach foreach ($record2->facts() as $fact) { 917fe676e5SGreg Roach if (!$fact->isPendingDeletion() && $fact->getTag() !== 'CHAN') { 925bbfbb82SGreg Roach $facts2[$fact->id()] = $fact; 935bbfbb82SGreg Roach } 945bbfbb82SGreg Roach } 955bbfbb82SGreg Roach 965bbfbb82SGreg Roach foreach ($facts1 as $id1 => $fact1) { 975bbfbb82SGreg Roach foreach ($facts2 as $id2 => $fact2) { 985bbfbb82SGreg Roach if ($fact1->id() === $fact2->id()) { 995bbfbb82SGreg Roach $facts[] = $fact1; 1005bbfbb82SGreg Roach unset($facts1[$id1], $facts2[$id2]); 1015bbfbb82SGreg Roach } 1025bbfbb82SGreg Roach } 1035bbfbb82SGreg Roach } 1045bbfbb82SGreg Roach 1055bbfbb82SGreg Roach return $this->viewResponse('admin/merge-records-step-2', [ 1065bbfbb82SGreg Roach 'facts' => $facts, 1075bbfbb82SGreg Roach 'facts1' => $facts1, 1085bbfbb82SGreg Roach 'facts2' => $facts2, 1095bbfbb82SGreg Roach 'record1' => $record1, 1105bbfbb82SGreg Roach 'record2' => $record2, 1115bbfbb82SGreg Roach 'title' => $title, 1125bbfbb82SGreg Roach 'tree' => $tree, 1135bbfbb82SGreg Roach ]); 1145bbfbb82SGreg Roach } 1155bbfbb82SGreg Roach} 116