xref: /webtrees/app/Census/AbstractCensusColumn.php (revision e364afe4ae4e316fc4ebd53eccbaff2d29e419a5)
14ccf2a72SGreg Roach<?php
24ccf2a72SGreg Roach/**
34ccf2a72SGreg Roach * webtrees: online genealogy
48fcd0d32SGreg Roach * Copyright (C) 2019 webtrees development team
54ccf2a72SGreg Roach * This program is free software: you can redistribute it and/or modify
64ccf2a72SGreg Roach * it under the terms of the GNU General Public License as published by
74ccf2a72SGreg Roach * the Free Software Foundation, either version 3 of the License, or
84ccf2a72SGreg Roach * (at your option) any later version.
94ccf2a72SGreg Roach * This program is distributed in the hope that it will be useful,
104ccf2a72SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
114ccf2a72SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
124ccf2a72SGreg Roach * GNU General Public License for more details.
134ccf2a72SGreg Roach * You should have received a copy of the GNU General Public License
144ccf2a72SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
154ccf2a72SGreg Roach */
16e7f56f2aSGreg Roachdeclare(strict_types=1);
1715d603e7SGreg Roach
184ccf2a72SGreg Roachnamespace Fisharebest\Webtrees\Census;
194ccf2a72SGreg Roach
204ccf2a72SGreg Roachuse Fisharebest\Webtrees\Date;
21b26116c9SGreg Roachuse Fisharebest\Webtrees\Family;
2240150762SGreg Roachuse Fisharebest\Webtrees\Individual;
234ccf2a72SGreg Roach
244ccf2a72SGreg Roach/**
254ccf2a72SGreg Roach * Definitions for a census column
264ccf2a72SGreg Roach */
27c1010edaSGreg Roachclass AbstractCensusColumn
28c1010edaSGreg Roach{
29ef21b467SGreg Roach    /** @var CensusInterface */
30ef21b467SGreg Roach    private $census;
31ef21b467SGreg Roach
32ef21b467SGreg Roach    /** @var string */
33ef21b467SGreg Roach    private $abbr;
34ef21b467SGreg Roach
35ef21b467SGreg Roach    /** @var string */
36ef21b467SGreg Roach    private $title;
374ccf2a72SGreg Roach
384ccf2a72SGreg Roach    /**
39db7d25eeSGreg Roach     * Create a column for a census
404ccf2a72SGreg Roach     *
41ef21b467SGreg Roach     * @param CensusInterface $census - The census to which this column forms part.
42ef21b467SGreg Roach     * @param string          $abbr   - The abbrievated on-screen name "BiC"
43ef21b467SGreg Roach     * @param string          $title  - The full column heading "Born in the county"
444ccf2a72SGreg Roach     */
45c1010edaSGreg Roach    public function __construct(CensusInterface $census, $abbr, $title)
46c1010edaSGreg Roach    {
47db7d25eeSGreg Roach        $this->census = $census;
48ef21b467SGreg Roach        $this->abbr   = $abbr;
49ef21b467SGreg Roach        $this->title  = $title;
50ef21b467SGreg Roach    }
51ef21b467SGreg Roach
52ef21b467SGreg Roach    /**
53ef21b467SGreg Roach     * A short version of the column's name.
54ef21b467SGreg Roach     *
55ef21b467SGreg Roach     * @return string
56ef21b467SGreg Roach     */
578f53f488SRico Sonntag    public function abbreviation(): string
58c1010edaSGreg Roach    {
59ef21b467SGreg Roach        return $this->abbr;
60db7d25eeSGreg Roach    }
61db7d25eeSGreg Roach
62db7d25eeSGreg Roach    /**
6340150762SGreg Roach     * Find the father of an individual
6440150762SGreg Roach     *
65b26116c9SGreg Roach     * @param Individual $individual
66b26116c9SGreg Roach     *
67b26116c9SGreg Roach     * @return Individual|null
6840150762SGreg Roach     */
69*e364afe4SGreg Roach    public function father(Individual $individual): ?Individual
70c1010edaSGreg Roach    {
7139ca88baSGreg Roach        $family = $individual->primaryChildFamily();
7240150762SGreg Roach
7340150762SGreg Roach        if ($family) {
7439ca88baSGreg Roach            return $family->husband();
7540150762SGreg Roach        }
76b2ce94c6SRico Sonntag
77b2ce94c6SRico Sonntag        return null;
7840150762SGreg Roach    }
7940150762SGreg Roach
8040150762SGreg Roach    /**
8140150762SGreg Roach     * Find the mother of an individual
8240150762SGreg Roach     *
83b26116c9SGreg Roach     * @param Individual $individual
84b26116c9SGreg Roach     *
85b26116c9SGreg Roach     * @return Individual|null
8640150762SGreg Roach     */
87*e364afe4SGreg Roach    public function mother(Individual $individual): ?Individual
88c1010edaSGreg Roach    {
8939ca88baSGreg Roach        $family = $individual->primaryChildFamily();
9040150762SGreg Roach
9140150762SGreg Roach        if ($family) {
9239ca88baSGreg Roach            return $family->wife();
9340150762SGreg Roach        }
94b2ce94c6SRico Sonntag
95b2ce94c6SRico Sonntag        return null;
9640150762SGreg Roach    }
9740150762SGreg Roach
9840150762SGreg Roach    /**
9915d603e7SGreg Roach     * Find the current spouse family of an individual
10015d603e7SGreg Roach     *
10115d603e7SGreg Roach     * @param Individual $individual
10215d603e7SGreg Roach     *
10315d603e7SGreg Roach     * @return Family|null
10415d603e7SGreg Roach     */
105*e364afe4SGreg Roach    public function spouseFamily(Individual $individual): ?Family
106c1010edaSGreg Roach    {
10715d603e7SGreg Roach        // Exclude families that were created after this census date
10815d603e7SGreg Roach        $families = [];
10939ca88baSGreg Roach        foreach ($individual->spouseFamilies() as $family) {
11015d603e7SGreg Roach            if (Date::compare($family->getMarriageDate(), $this->date()) <= 0) {
11115d603e7SGreg Roach                $families[] = $family;
11215d603e7SGreg Roach            }
11315d603e7SGreg Roach        }
11415d603e7SGreg Roach
11515d603e7SGreg Roach        if (empty($families)) {
11615d603e7SGreg Roach            return null;
117b2ce94c6SRico Sonntag        }
118b2ce94c6SRico Sonntag
119492c7072SGreg Roach        usort($families, function (Family $x, Family $y): int {
12015d603e7SGreg Roach            return Date::compare($x->getMarriageDate(), $y->getMarriageDate());
12115d603e7SGreg Roach        });
12215d603e7SGreg Roach
12315d603e7SGreg Roach        return end($families);
12415d603e7SGreg Roach    }
12515d603e7SGreg Roach
12615d603e7SGreg Roach    /**
12715d603e7SGreg Roach     * When did this census occur
12815d603e7SGreg Roach     *
12915d603e7SGreg Roach     * @return Date
13015d603e7SGreg Roach     */
1318f53f488SRico Sonntag    public function date(): Date
132c1010edaSGreg Roach    {
13315d603e7SGreg Roach        return new Date($this->census->censusDate());
13415d603e7SGreg Roach    }
13515d603e7SGreg Roach
13615d603e7SGreg Roach    /**
13715d603e7SGreg Roach     * The full version of the column's name.
13815d603e7SGreg Roach     *
13915d603e7SGreg Roach     * @return string
14015d603e7SGreg Roach     */
1418f53f488SRico Sonntag    public function title(): string
142c1010edaSGreg Roach    {
14315d603e7SGreg Roach        return $this->title;
14415d603e7SGreg Roach    }
14515d603e7SGreg Roach
14615d603e7SGreg Roach    /**
14715d603e7SGreg Roach     * Extract the country (last part) of a place name.
14815d603e7SGreg Roach     *
14915d603e7SGreg Roach     * @param string $place - e.g. "London, England"
15015d603e7SGreg Roach     *
15115d603e7SGreg Roach     * @return string - e.g. "England"
15215d603e7SGreg Roach     */
1537d99559cSGreg Roach    protected function lastPartOfPlace(string $place): string
154c1010edaSGreg Roach    {
1557d99559cSGreg Roach        $parts = explode(', ', $place);
15615d603e7SGreg Roach
1577d99559cSGreg Roach        return end($parts);
15815d603e7SGreg Roach    }
15915d603e7SGreg Roach
16015d603e7SGreg Roach    /**
161a53db70dSGreg Roach     * Remove the country of a place name, where it is the same as the census place
162a53db70dSGreg Roach     *
163a53db70dSGreg Roach     * @param string $place - e.g. "London, England"
164a53db70dSGreg Roach     *
165a53db70dSGreg Roach     * @return string - e.g. "London" (for census of England) and "London, England" elsewhere
166a53db70dSGreg Roach     */
1677d99559cSGreg Roach    protected function notCountry(string $place): string
168c1010edaSGreg Roach    {
169a53db70dSGreg Roach        $parts = explode(', ', $place);
170a53db70dSGreg Roach
171a53db70dSGreg Roach        if (end($parts) === $this->place()) {
172a53db70dSGreg Roach            return implode(', ', array_slice($parts, 0, -1));
173a53db70dSGreg Roach        }
174b2ce94c6SRico Sonntag
175b2ce94c6SRico Sonntag        return $place;
176a53db70dSGreg Roach    }
177a53db70dSGreg Roach
178a53db70dSGreg Roach    /**
179db7d25eeSGreg Roach     * Where did this census occur
180db7d25eeSGreg Roach     *
181ef21b467SGreg Roach     * @return string
182db7d25eeSGreg Roach     */
1838f53f488SRico Sonntag    public function place(): string
184c1010edaSGreg Roach    {
185db7d25eeSGreg Roach        return $this->census->censusPlace();
1864ccf2a72SGreg Roach    }
1874ccf2a72SGreg Roach}
188