xref: /webtrees/app/Http/RequestHandlers/MergeFactsPage.php (revision 5bbfbb827763d1327d8312b88cb750c6dec7b775)
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