. */ namespace Fisharebest\Webtrees\Census; use Fisharebest\Webtrees\Date; use Fisharebest\Webtrees\Individual; /** * Marital status. */ abstract class AbstractCensusColumnCondition extends AbstractCensusColumn implements CensusColumnInterface { /* Text to display for married males */ protected $husband = ''; /* Text to display for married females */ protected $wife = ''; /* Text to display for unmarried males */ protected $bachelor = ''; /* Text to display for unmarried females */ protected $spinster = ''; /* Text to display for male children */ protected $boy = ''; /* Text to display for female children */ protected $girl = ''; /* Text to display for divorced males */ protected $divorce = ''; /* Text to display for divorced females */ protected $divorcee = ''; /* Text to display for widowed males */ protected $widower = ''; /* Text to display for widowed females */ protected $widow = ''; /* At what age is this individual recorded as an adult */ protected $age_adult = 15; /** * Generate the likely value of this census column, based on available information. * * @param Individual $individual * @param Individual $head * * @return string */ public function generate(Individual $individual, Individual $head) { $family = $this->spouseFamily($individual); $sex = $individual->getSex(); if ($family === null || count($family->getFacts('MARR')) === 0) { if ($this->isChild($individual)) { return $this->conditionChild($sex); } else { return $this->conditionSingle($sex); } } elseif (count($family->getFacts('DIV')) > 0) { return $this->conditionDivorced($sex); } else { $spouse = $family->getSpouse($individual); if ($spouse instanceof Individual && $this->isDead($spouse)) { return $this->conditionWidowed($sex); } else { return $this->conditionMarried($sex); } } } /** * Is the individual a child. * * @param Individual $individual * * @return bool */ private function isChild(Individual $individual): bool { $age = (int)Date::getAge($individual->getEstimatedBirthDate(), $this->date(), 0); return $age < $this->age_adult; } /** * How is this condition written in a census column. * * @param string $sex * * @return string */ private function conditionChild($sex) { if ($sex === 'F') { return $this->girl; } else { return $this->boy; } } /** * How is this condition written in a census column. * * @param string $sex * * @return string */ private function conditionSingle($sex) { if ($sex === 'F') { return $this->spinster; } else { return $this->bachelor; } } /** * How is this condition written in a census column. * * @param string $sex * * @return string */ private function conditionDivorced($sex) { if ($sex === 'F') { return $this->divorcee; } else { return $this->divorce; } } /** * Is the individual dead. * * @param Individual $individual * * @return bool */ private function isDead(Individual $individual): bool { return $individual->getDeathDate()->isOK() && Date::compare($individual->getDeathDate(), $this->date()) < 0; } /** * How is this condition written in a census column. * * @param string $sex * * @return string */ private function conditionWidowed($sex) { if ($sex === 'F') { return $this->widow; } else { return $this->widower; } } /** * How is this condition written in a census column. * * @param string $sex * * @return string */ private function conditionMarried($sex) { if ($sex === 'F') { return $this->wife; } else { return $this->husband; } } }