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