xref: /webtrees/app/Census/AbstractCensusColumn.php (revision 8d897fd11a9a8845d8456cb9eaad33b9c9d5a225)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2019 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17declare(strict_types=1);
18
19namespace Fisharebest\Webtrees\Census;
20
21use Fisharebest\Webtrees\Date;
22use Fisharebest\Webtrees\Family;
23use Fisharebest\Webtrees\Individual;
24
25use function array_slice;
26use function explode;
27use function implode;
28
29/**
30 * Definitions for a census column
31 */
32class AbstractCensusColumn
33{
34    /** @var CensusInterface */
35    private $census;
36
37    /** @var string */
38    private $abbr;
39
40    /** @var string */
41    private $title;
42
43    /**
44     * Create a column for a census
45     *
46     * @param CensusInterface $census - The census to which this column forms part.
47     * @param string          $abbr   - The abbreviated on-screen name "BiC"
48     * @param string          $title  - The full column heading "Born in the county"
49     */
50    public function __construct(CensusInterface $census, string $abbr, string $title)
51    {
52        $this->census = $census;
53        $this->abbr   = $abbr;
54        $this->title  = $title;
55    }
56
57    /**
58     * A short version of the column's name.
59     *
60     * @return string
61     */
62    public function abbreviation(): string
63    {
64        return $this->abbr;
65    }
66
67    /**
68     * Find the father of an individual
69     *
70     * @param Individual $individual
71     *
72     * @return Individual|null
73     */
74    public function father(Individual $individual): ?Individual
75    {
76        $family = $individual->primaryChildFamily();
77
78        if ($family instanceof Family) {
79            return $family->husband();
80        }
81
82        return null;
83    }
84
85    /**
86     * Find the mother of an individual
87     *
88     * @param Individual $individual
89     *
90     * @return Individual|null
91     */
92    public function mother(Individual $individual): ?Individual
93    {
94        $family = $individual->primaryChildFamily();
95
96        if ($family instanceof Family) {
97            return $family->wife();
98        }
99
100        return null;
101    }
102
103    /**
104     * Find the current spouse family of an individual
105     *
106     * @param Individual $individual
107     *
108     * @return Family|null
109     */
110    public function spouseFamily(Individual $individual): ?Family
111    {
112        return $individual->spouseFamilies()
113            ->filter(function (Family $family): bool {
114                // Exclude families that were created after this census date
115                return Date::compare($family->getMarriageDate(), $this->date()) <= 0;
116            })
117            ->sort(Family::marriageDateComparator())
118            ->last();
119    }
120
121    /**
122     * When did this census occur
123     *
124     * @return Date
125     */
126    public function date(): Date
127    {
128        return new Date($this->census->censusDate());
129    }
130
131    /**
132     * The full version of the column's name.
133     *
134     * @return string
135     */
136    public function title(): string
137    {
138        return $this->title;
139    }
140
141    /**
142     * Extract the country (last part) of a place name.
143     *
144     * @param string $place - e.g. "London, England"
145     *
146     * @return string - e.g. "England"
147     */
148    protected function lastPartOfPlace(string $place): string
149    {
150        $parts = explode(', ', $place);
151
152        return end($parts);
153    }
154
155    /**
156     * Remove the country of a place name, where it is the same as the census place
157     *
158     * @param string $place - e.g. "London, England"
159     *
160     * @return string - e.g. "London" (for census of England) and "London, England" elsewhere
161     */
162    protected function notCountry(string $place): string
163    {
164        $parts = explode(', ', $place);
165
166        if (end($parts) === $this->place()) {
167            return implode(', ', array_slice($parts, 0, -1));
168        }
169
170        return $place;
171    }
172
173    /**
174     * Where did this census occur
175     *
176     * @return string
177     */
178    public function place(): string
179    {
180        return $this->census->censusPlace();
181    }
182}
183