diff --git a/composer.json b/composer.json index b22a176..1538ae1 100644 --- a/composer.json +++ b/composer.json @@ -10,11 +10,15 @@ ], "license": "MIT", "require": { - "php": ">=5.5", - "symfony/property-access": "^2.3" + "php": ">=8.1", + "symfony/property-access": "^5.4|^6.0", + "ext-zip": "*", + "ext-dom": "*", + "ext-simplexml": "*" }, "require-dev": { - "phpunit/phpunit": "^4.8|^5.0" + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.15.0" }, "autoload": { "psr-4": {"leonverschuren\\Lenex\\": "src/"} diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..806fe66 --- /dev/null +++ b/rector.php @@ -0,0 +1,14 @@ +paths([ + __DIR__ . '/src', + ]); + + $rectorConfig->sets([ + LevelSetList::UP_TO_PHP_81, + ]); +}; \ No newline at end of file diff --git a/src/Converter.php b/src/Converter.php new file mode 100644 index 0000000..8ca4b03 --- /dev/null +++ b/src/Converter.php @@ -0,0 +1,433 @@ +' . + '' + ); + + // Добавляем основные элементы + $this->addAttributeIfSet($xml, 'version', $lenex->getVersion()); + + // Добавляем CONSTRUCTOR + if ($lenex->getConstructor()) { + $constructor = $xml->addChild('CONSTRUCTOR'); + $this->addAttributeIfSet($constructor, 'name', $lenex->getConstructor()->getName()); + $this->addAttributeIfSet($constructor, 'registration', $lenex->getConstructor()->getRegistration()); + $this->addAttributeIfSet($constructor, 'version', $lenex->getConstructor()->getVersion()); + + // Добавляем CONTACT + if ($lenex->getConstructor()->getContact()) { + $this->addContact($constructor, $lenex->getConstructor()->getContact()); + } + } + + + // Обрабатываем встречи + if ($lenex->getMeets()) { + $meetsXml = $xml->addChild('MEETS'); + + foreach ($lenex->getMeets() as $meet) { + $this->addMeet($meetsXml, $meet); + } + } + + if ($lenex->getTimeStandardLists()) { + $meetsXml = $xml->addChild('TIMESTANDARDLISTS'); + + foreach ($lenex->getTimeStandardLists() as $timeStandardList) { + $this->addTimeStandardLists($meetsXml, $timeStandardList); + } + } + + return $xml; + } + + private function addContact(SimpleXMLElement $parent, Contact $contact): void + { + $contactXml = $parent->addChild('CONTACT'); + $this->addAttributeIfSet($contactXml, 'name', $contact->getName()); + $this->addAttributeIfSet($contactXml, 'street', $contact->getStreet()); + $this->addAttributeIfSet($contactXml, 'city', $contact->getCity()); + $this->addAttributeIfSet($contactXml, 'zip', $contact->getZip()); + $this->addAttributeIfSet($contactXml, 'country', $contact->getCountry()); + $this->addAttributeIfSet($contactXml, 'email', $contact->getEmail()); + $this->addAttributeIfSet($contactXml, 'internet', $contact->getInternet()); + $this->addAttributeIfSet($contactXml, 'fax', $contact->getFax()); + $this->addAttributeIfSet($contactXml, 'phone', $contact->getPhone()); + } + + private function addClub(SimpleXMLElement $parent, Club $club): void + { + $clubXml = $parent->addChild('CLUB'); + $this->addAttributeIfSet($clubXml,'clubid', $club->getClubId()); + $this->addAttributeIfSet($clubXml,'code', $club->getCode()); + $this->addAttributeIfSet($clubXml,'name', $club->getName()); + $this->addAttributeIfSet($clubXml,'name.en', $club->getNameEn()); + $this->addAttributeIfSet($clubXml,'nation', $club->getNation()); + $this->addAttributeIfSet($clubXml,'type', $club->getType()); + $this->addAttributeIfSet($clubXml,'swrid', $club->getSwrId()); + $this->addAttributeIfSet($clubXml,'shortname', $club->getShortName()); + $this->addAttributeIfSet($clubXml,'shortname.en', $club->getShortNameEn()); + $this->addAttributeIfSet($clubXml,'region', $club->getRegion()); + $this->addAttributeIfSet($clubXml,'number', $club->getNumber()); + + $athletes = $clubXml->addChild('ATHLETES'); + foreach ($club->getAthletes() as $athlete) { + $this->addAthlete($athletes, $athlete); + } + } + + private function addAthlete(SimpleXMLElement $parent, Athlete $athlete): void + { + $athleteXml = $parent->addChild('ATHLETE'); + $this->addAttributeIfSet($athleteXml, 'athleteid', $athlete->getAthleteId()); + $this->addAttributeIfSet($athleteXml,'birthdate', $athlete->getBirthdate()); + $this->addAttributeIfSet($athleteXml,'firstname', $athlete->getFirstName()); + $this->addAttributeIfSet($athleteXml,'firstname.en', $athlete->getFirstNameEn()); + $this->addAttributeIfSet($athleteXml,'gender', $athlete->getGender()); + $this->addAttributeIfSet($athleteXml,'lastname', $athlete->getLastName()); + $this->addAttributeIfSet($athleteXml,'lastname.en', $athlete->getLastNameEn()); + $this->addAttributeIfSet($athleteXml,'level', $athlete->getLevel()); + $this->addAttributeIfSet($athleteXml,'license', $athlete->getLicense()); + $this->addAttributeIfSet($athleteXml,'nameprefix', $athlete->getNamePrefix()); + $this->addAttributeIfSet($athleteXml,'nation', $athlete->getNation()); + $this->addAttributeIfSet($athleteXml,'passport', $athlete->getPassport()); + $this->addAttributeIfSet($athleteXml,'swrid', $athlete->getSwrid()); + + $results = $athleteXml->addChild('RESULTS'); + foreach ($athlete->getResults() as $result) { + $this->addResult($results, $result); + } + + if (!empty($athlete->getEntries())) { + $entries = $athleteXml->addChild('ENTRIES'); + foreach ($athlete->getEntries() as $entry) { + $this->addEntry($entries, $entry); + } + } + } + + private function addResult(SimpleXMLElement $parent, Result $result): void + { + $xml = $parent->addChild('RESULT'); + $this->addAttributeIfSet($xml,'comment', $result->getComment()); + $this->addAttributeIfSet($xml,'eventid', $result->getEventid()); + $this->addAttributeIfSet($xml,'heatid', $result->getHeatId()); + $this->addAttributeIfSet($xml,'lane', $result->getLane()); + $this->addAttributeIfSet($xml,'points', $result->getPoints()); + $this->addAttributeIfSet($xml,'reactiontime', $result->getReactionTime()); + $this->addAttributeIfSet($xml,'resultid', $result->getResultId()); + $this->addAttributeIfSet($xml,'status', $result->getStatus()); + $this->addAttributeIfSet($xml,'swimtime', $result->getSwimTime()); + $this->addAttributeIfSet($xml,'entrytime', $result->getEntryTime()); + $this->addAttributeIfSet($xml,'entrycourse', $result->getEntryCourse()); + $this->addAttributeIfSet($xml,'late', $result->getLate()); + + if ($relayPositions = $result->getRelayPositions()) { + $relayPositionsXml = $xml->addChild('RELAYPOSITIONS'); + foreach ($relayPositions as $relayPosition) { + $this->addRelayPosition($relayPositionsXml, $relayPosition); + } + } + if ($splits = $result->getSplits()) { + $splitsXml = $xml->addChild('SPLITS'); + foreach ($splits as $split) { + $this->addSplit($splitsXml, $split); + } + } + } + + private function addSplit(SimpleXMLElement $parent, Split $model): void + { + $xml = $parent->addChild('SPLIT'); + $this->addAttributeIfSet($xml,'distance', $model->getDistance()); + $this->addAttributeIfSet($xml,'swimtime', $model->getSwimTime()); + } + + private function addRelayPosition(SimpleXMLElement $parent, RelayPosition $model): void + { + $xml = $parent->addChild('RELAYPOSITIONS'); + $this->addAttributeIfSet($xml,'athleteid', $model->getAthleteId()); + $this->addAttributeIfSet($xml,'number', $model->getNumber()); + $this->addAttributeIfSet($xml,'reactiontime', $model->getReactionTime()); + $this->addAttributeIfSet($xml,'status', $model->getStatus()); + + if ($athlete = $model->getAthlete()) { + $this->addAthlete($xml, $athlete); + } + if ($meetInfo = $model->getMeetInfo()) { + $this->addMeetInfo($xml, $meetInfo); + } + } + + private function addEntry(SimpleXMLElement $parent, Entry $entry): void + { + $entryXml = $parent->addChild('ENTRY'); + $this->addAttributeIfSet($entryXml,'entrytime', $entry->getEntryTime()); + $this->addAttributeIfSet($entryXml,'eventid', $entry->getEventId()); + + if ($meetInfo = $entry->getMeetInfo()) { + $this->addMeetInfo($entryXml, $meetInfo); + } + } + + private function addMeetInfo(SimpleXMLElement $parent, MeetInfo $meetInfo): void + { + $meetInfoXml = $parent->addChild('MEETINFO'); + $this->addAttributeIfSet($meetInfoXml,'city', $meetInfo->getCity()); + $this->addAttributeIfSet($meetInfoXml,'course', $meetInfo->getCourse()); + $this->addAttributeIfSet($meetInfoXml,'date', $meetInfo->getDate()); + $this->addAttributeIfSet($meetInfoXml,'name', $meetInfo->getName()); + $this->addAttributeIfSet($meetInfoXml,'nation', $meetInfo->getNation()); + } + + private function addMeet(SimpleXMLElement $parent, Meet $meet): void + { + $meetXml = $parent->addChild('MEET'); + $this->addAttributeIfSet($meetXml, 'name', $meet->getName()); + $this->addAttributeIfSet($meetXml, 'name.en', $meet->getNameEn()); + $this->addAttributeIfSet($meetXml, 'city', $meet->getCity()); + $this->addAttributeIfSet($meetXml, 'course', $meet->getCourse()); + $this->addAttributeIfSet($meetXml, 'reservecount', $meet->getReserveCount()); + $this->addAttributeIfSet($meetXml, 'startmethod', $meet->getStartMethod()); + $this->addAttributeIfSet($meetXml, 'timing', $meet->getTiming()); + $this->addAttributeIfSet($meetXml, 'nation', $meet->getNation()); + $this->addAttributeIfSet($meetXml, 'deadline', $meet->getDeadline()); + $this->addAttributeIfSet($meetXml, 'altitude', $meet->getAltitude()); + $this->addAttributeIfSet($meetXml, 'city.en', $meet->getCityEn()); + $this->addAttributeIfSet($meetXml, 'deadlinetime', $meet->getDeadlineTime()); + $this->addAttributeIfSet($meetXml, 'entrystartdate', $meet->getEntryStartDate()); + $this->addAttributeIfSet($meetXml, 'entrytype', $meet->getEntryType()); + $this->addAttributeIfSet($meetXml, 'hostclub', $meet->getHostClub()); + $this->addAttributeIfSet($meetXml, 'hostclub.url', $meet->getHostClubUrl()); + $this->addAttributeIfSet($meetXml, 'maxentries', $meet->getMaxEntries()); + $this->addAttributeIfSet($meetXml, 'number', $meet->getNumber()); + $this->addAttributeIfSet($meetXml, 'organizer', $meet->getOrganizer()); + $this->addAttributeIfSet($meetXml, 'organizer.url', $meet->getOrganizerUrl()); + $this->addAttributeIfSet($meetXml, 'result.url', $meet->getResultUrl()); + $this->addAttributeIfSet($meetXml, 'state', $meet->getState()); + $this->addAttributeIfSet($meetXml, 'swrid', $meet->getSwrId()); + $this->addAttributeIfSet($meetXml, 'type', $meet->getType()); + $this->addAttributeIfSet($meetXml, 'withdrawuntil', $meet->getWithdrawUntil()); + + // Добавляем AGEDATE + if ($meet->getAgeDate()) { + $ageDate = $meetXml->addChild('AGEDATE'); + $this->addAttributeIfSet($ageDate, 'value', $meet->getAgeDate()->getValue()); + $this->addAttributeIfSet($ageDate, 'type', $meet->getAgeDate()->getType()); + } + + // Добавляем POOL + if ($meet->getPool()) { + $pool = $meetXml->addChild('POOL'); + $this->addAttributeIfSet($pool, 'name', $meet->getPool()->getName()); + $this->addAttributeIfSet($pool, 'lanemax', $meet->getPool()->getLaneMax()); + $this->addAttributeIfSet($pool, 'lanemin', $meet->getPool()->getLaneMin()); + } + + // Добавляем FACILITY + if ($meet->getFacility()) { + $facility = $meetXml->addChild('FACILITY'); + $this->addAttributeIfSet($facility, 'city', $meet->getFacility()->getCity()); + $this->addAttributeIfSet($facility, 'name', $meet->getFacility()->getName()); + $this->addAttributeIfSet($facility, 'nation', $meet->getFacility()->getNation()); + $this->addAttributeIfSet($facility, 'state', $meet->getFacility()->getState()); + $this->addAttributeIfSet($facility, 'street', $meet->getFacility()->getStreet()); + $this->addAttributeIfSet($facility, 'street2', $meet->getFacility()->getStreet2()); + $this->addAttributeIfSet($facility, 'zip', $meet->getFacility()->getZip()); + } + + // Добавляем POINTTABLE + if ($meet->getPointTable()) { + $pointTable = $meetXml->addChild('POINTTABLE'); + $this->addAttributeIfSet($pointTable, 'pointtableid', $meet->getPointTable()->getPointTableId()); + $this->addAttributeIfSet($pointTable, 'name', $meet->getPointTable()->getName()); + $this->addAttributeIfSet($pointTable, 'version', $meet->getPointTable()->getVersion()); + } + + if ($meet->getContact()) { + $this->addContact($meetXml, $meet->getContact()); + } + + // Добавляем сессии + if ($meet->getSessions()) { + $sessionsXml = $meetXml->addChild('SESSIONS'); + foreach ($meet->getSessions() as $session) { + $this->addSession($sessionsXml, $session); + } + } + + if ($meet->getClubs()) { + $clubs = $meetXml->addChild('CLUBS'); + foreach ($meet->getClubs() as $club) { + $this->addClub($clubs, $club); + } + } + } + + private function addSession(SimpleXMLElement $parent, Session $session): void + { + $sessionXml = $parent->addChild('SESSION'); + $this->addAttributeIfSet($sessionXml, 'date', $session->getDate()); + $this->addAttributeIfSet($sessionXml, 'daytime', $session->getDayTime()); + $this->addAttributeIfSet($sessionXml, 'endtime', $session->getEndTime()); + $this->addAttributeIfSet($sessionXml, 'number', $session->getNumber()); + $this->addAttributeIfSet($sessionXml, 'name', $session->getName()); + $this->addAttributeIfSet($sessionXml, 'warmupfrom', $session->getWarmUpFrom()); + $this->addAttributeIfSet($sessionXml, 'warmupuntil', $session->getWarmUpUntil()); + $this->addAttributeIfSet($sessionXml, 'officialmeeting', $session->getOfficialMeeting()); + + // Добавляем события + if ($session->getEvents()) { + $eventsXml = $sessionXml->addChild('EVENTS'); + foreach ($session->getEvents() as $event) { + $this->addEvent($eventsXml, $event); + } + } + } + + private function addEvent(SimpleXMLElement $parent, Event $event): void + { + $eventXml = $parent->addChild('EVENT'); + $this->addAttributeIfSet($eventXml, 'eventid', $event->getEventId()); + $this->addAttributeIfSet($eventXml, 'daytime', $event->getDayTime()); + $this->addAttributeIfSet($eventXml, 'gender', $event->getGender()); + $this->addAttributeIfSet($eventXml, 'number', $event->getNumber()); + $this->addAttributeIfSet($eventXml, 'order', $event->getOrder()); + $this->addAttributeIfSet($eventXml, 'round', $event->getRound()); + $this->addAttributeIfSet($eventXml, 'preveventid', $event->getPrevEventId()); + + // Добавляем SWIMSTYLE + if ($event->getSwimStyle()) { + $swimStyle = $eventXml->addChild('SWIMSTYLE'); + $this->addAttributeIfSet($swimStyle, 'distance', $event->getSwimStyle()->getDistance()); + $this->addAttributeIfSet($swimStyle, 'relaycount', $event->getSwimStyle()->getRelayCount()); + $this->addAttributeIfSet($swimStyle, 'stroke', $event->getSwimStyle()->getStroke()); + } + + // Добавляем AGEGROUPS + if ($event->getAgeGroups()) { + $ageGroupsXml = $eventXml->addChild('AGEGROUPS'); + foreach ($event->getAgeGroups() as $ageGroup) { + $ageGroupXml = $ageGroupsXml->addChild('AGEGROUP'); + $this->addAttributeIfSet($ageGroupXml, 'agegroupid', $ageGroup->getAgeGroupId()); + $this->addAttributeIfSet($ageGroupXml, 'agemax', $ageGroup->getAgeMax()); + $this->addAttributeIfSet($ageGroupXml, 'agemin', $ageGroup->getAgeMin()); + $this->addAttributeIfSet($ageGroupXml, 'name', $ageGroup->getName()); + $this->addAttributeIfSet($ageGroupXml, 'handicap', $ageGroup->getHandicap()); + + if ($ageGroup->getRankings()) { + $rankingsXml = $ageGroupXml->addChild('RANKINGS'); + foreach ($ageGroup->getRankings() as $ranking) { + $this->addRanking($rankingsXml, $ranking); + } + } + } + } + + if ($event->getHeats()) { + $heatsXml = $eventXml->addChild('HEATS'); + foreach ($event->getHeats() as $heat) { + $heatXml = $heatsXml->addChild('HEAT'); + $this->addAttributeIfSet($heatXml, 'agegroupid', $heat->getAgeGroupId()); + $this->addAttributeIfSet($heatXml, 'daytime', $heat->getDayTime()); + $this->addAttributeIfSet($heatXml, 'final', $heat->getFinal()); + $this->addAttributeIfSet($heatXml, 'heatid', $heat->getHeatId()); + $this->addAttributeIfSet($heatXml, 'number', $heat->getNumber()); + $this->addAttributeIfSet($heatXml, 'order', $heat->getOrder()); + $this->addAttributeIfSet($heatXml, 'status', $heat->getStatus()); + } + } + + // Добавляем TIMESTANDARDREFS + if ($event->getTimeStandardRefs()) { + $timeStandardRefsXml = $eventXml->addChild('TIMESTANDARDREFS'); + foreach ($event->getTimeStandardRefs() as $timeStandardRef) { + $timeStandardRefXml = $timeStandardRefsXml->addChild('TIMESTANDARDREF'); + $this->addAttributeIfSet($timeStandardRefXml, 'marker', $timeStandardRef->getMarker()); + $this->addAttributeIfSet($timeStandardRefXml, 'timestandardlistid', $timeStandardRef->getTimeStandardListId()); + } + } + } + + private function addRanking(SimpleXMLElement $parent, Ranking $ranking): void + { + $xml = $parent->addChild('RANKING'); + $this->addAttributeIfSet($xml, 'order', $ranking->getOrder()); + $this->addAttributeIfSet($xml, 'place', $ranking->getPlace()); + $this->addAttributeIfSet($xml, 'resultid', $ranking->getResultId()); + } + private function addTimeStandardLists(SimpleXMLElement $parent, TimeStandardList $timeStandardList): void + { + $meetXml = $parent->addChild('TIMESTANDARDLIST'); + $this->addAttributeIfSet($meetXml, 'name', $timeStandardList->getName()); + $this->addAttributeIfSet($meetXml, 'code', $timeStandardList->getCode()); + $this->addAttributeIfSet($meetXml, 'course', $timeStandardList->getCourse()); + $this->addAttributeIfSet($meetXml, 'gender', $timeStandardList->getGender()); + $this->addAttributeIfSet($meetXml, 'handicap', $timeStandardList->getHandicap()); + $this->addAttributeIfSet($meetXml, 'timestandardlistid', $timeStandardList->getTimeStandardListId()); + $this->addAttributeIfSet($meetXml, 'type', $timeStandardList->getType()); + + + if ($timeStandardList->getAgeGroup()) { + $ageGroup = $timeStandardList->getAgeGroup(); + $ageGroupXml = $meetXml->addChild('AGEGROUP'); + $this->addAttributeIfSet($ageGroupXml, 'agegroupid', $ageGroup->getAgeGroupId()); + $this->addAttributeIfSet($ageGroupXml, 'agemax', $ageGroup->getAgeMax()); + $this->addAttributeIfSet($ageGroupXml, 'agemin', $ageGroup->getAgeMin()); + } + + if ($timeStandardList->getTimeStandards()) { + $timeStandardsXml = $meetXml->addChild('TIMESTANDARDS'); + foreach ($timeStandardList->getTimeStandards() as $timeStandard) { + $this->addTimeStandard($timeStandardsXml, $timeStandard); + } + } + } + + private function addTimeStandard(SimpleXMLElement $parent, TimeStandard $timeStandard) + { + $timeStandardXml = $parent->addChild('TIMESTANDARD'); + $this->addAttributeIfSet($timeStandardXml, 'swimtime', $timeStandard->getSwimTime()); + if ($timeStandard->getSwimStyle()) { + $swimStyle = $timeStandardXml->addChild('SWIMSTYLE'); + $this->addAttributeIfSet($swimStyle, 'distance', $timeStandard->getSwimStyle()->getDistance()); + $this->addAttributeIfSet($swimStyle, 'relaycount', $timeStandard->getSwimStyle()->getRelayCount()); + $this->addAttributeIfSet($swimStyle, 'stroke', $timeStandard->getSwimStyle()->getStroke()); + } + } + + private function addAttributeIfSet(SimpleXMLElement $element, string $name, mixed $value): void + { + if ($value instanceof \DateTimeInterface) { + $value = $value->format('Y-m-d'); + } + if ($value !== null) { + $element->addAttribute($name, $value); + } + } +} \ No newline at end of file diff --git a/src/Model/Club.php b/src/Model/Club.php index 519fd5b..e62fcef 100644 --- a/src/Model/Club.php +++ b/src/Model/Club.php @@ -20,6 +20,9 @@ class Club /** @var string */ protected $code; + /** @var int|null */ + protected $clubId; + /** @var Contact */ protected $contact; @@ -321,4 +324,14 @@ public function setType($type) return $this; } + + public function getClubId(): ?int + { + return $this->clubId; + } + + public function setClubId(?int $clubId): void + { + $this->clubId = $clubId; + } } diff --git a/src/Model/Facility.php b/src/Model/Facility.php new file mode 100644 index 0000000..f80bd27 --- /dev/null +++ b/src/Model/Facility.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace leonverschuren\Lenex\Model; + +class Facility +{ + /** @var string */ + protected $name; + + /** @var string */ + protected $city; + + /** @var string */ + protected $nation; + + /** @var string */ + protected $state; + + /** @var string */ + protected $street; + + /** @var string */ + protected $street2; + + /** @var int */ + protected $zip; + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getCity(): ?string + { + return $this->city; + } + + public function setCity(string $city): void + { + $this->city = $city; + } + + public function getNation(): ?string + { + return $this->nation; + } + + public function setNation(string $nation): void + { + $this->nation = $nation; + } + + public function getState(): ?string + { + return $this->state; + } + + public function setState(string $state): void + { + $this->state = $state; + } + + public function getStreet(): ?string + { + return $this->street; + } + + public function setStreet(string $street): void + { + $this->street = $street; + } + + public function getStreet2(): ?string + { + return $this->street2; + } + + public function setStreet2(string $street2): void + { + $this->street2 = $street2; + } + + public function getZip(): ?int + { + return $this->zip; + } + + public function setZip(int $zip): void + { + $this->zip = $zip; + } + +} diff --git a/src/Model/Meet.php b/src/Model/Meet.php index 2eafc86..8285d00 100644 --- a/src/Model/Meet.php +++ b/src/Model/Meet.php @@ -85,6 +85,9 @@ class Meet /** @var Pool */ protected $pool; + /** @var Facility */ + protected $facility; + /** @var Qualify */ protected $qualify; @@ -533,6 +536,17 @@ public function setPointTable($pointTable) return $this; } + /** + * @param Pool $pool + * @return $this + */ + public function setPool($pool) + { + $this->pool = $pool; + + return $this; + } + /** * @return Pool */ @@ -542,12 +556,20 @@ public function getPool() } /** - * @param Pool $pool + * @return Facility + */ + public function getFacility() + { + return $this->facility; + } + + /** + * @param $facility * @return $this */ - public function setPool($pool) + public function setFacility($facility) { - $this->pool = $pool; + $this->facility = $facility; return $this; } diff --git a/src/Model/Result.php b/src/Model/Result.php index 9e8c692..f497df5 100644 --- a/src/Model/Result.php +++ b/src/Model/Result.php @@ -14,39 +14,47 @@ class Result { - /** @var string */ + /** @var string|null */ protected $comment; - /** @var int */ + /** @var int|null */ protected $eventId; - /** @var int */ + /** @var int|null */ protected $heatId; - /** @var int */ + /** @var int|null */ protected $lane; - /** @var int */ + /** @var int|null */ protected $points; - /** @var string */ + /** @var string|null */ protected $reactionTime; /** @var RelayPosition[] */ protected $relayPositions = []; - /** @var int */ + /** @var int|null */ protected $resultId; - /** @var string */ + /** @var string|null */ protected $status; /** @var Split[] */ protected $splits = []; - /** @var string */ + /** @var string|null */ protected $swimTime; + /** @var string|null */ + protected $entryTime; + + /** @var string|null */ + protected $entryCourse; + /** @var string|null */ + protected $late; + /** * @return string */ @@ -255,4 +263,34 @@ public function setSwimTime($swimTime) return $this; } + + public function getEntryTime(): ?string + { + return $this->entryTime; + } + + public function setEntryTime(string $entryTime): void + { + $this->entryTime = $entryTime; + } + + public function getEntryCourse(): ?string + { + return $this->entryCourse; + } + + public function setEntryCourse(string $entryCourse): void + { + $this->entryCourse = $entryCourse; + } + + public function getLate(): ?string + { + return $this->late; + } + + public function setLate(?string $late): void + { + $this->late = $late; + } } diff --git a/src/Model/TimeStandardList.php b/src/Model/TimeStandardList.php index c031dac..a88fc0e 100644 --- a/src/Model/TimeStandardList.php +++ b/src/Model/TimeStandardList.php @@ -20,6 +20,9 @@ class TimeStandardList /** @var string */ protected $course; + /** @var string */ + protected $code; + /** @var string */ protected $gender; @@ -189,4 +192,14 @@ public function setType($type) return $this; } + + public function getCode(): ?string + { + return $this->code; + } + + public function setCode(string $code): void + { + $this->code = $code; + } } diff --git a/src/Model/TimeStandardRef.php b/src/Model/TimeStandardRef.php index 8b9ae5a..1326cce 100644 --- a/src/Model/TimeStandardRef.php +++ b/src/Model/TimeStandardRef.php @@ -51,7 +51,6 @@ public function getFee() } /** - * @param Fee $fee * @return $this */ public function setFee(Fee $fee) diff --git a/src/Parser.php b/src/Parser.php index 0fc119d..c6b3f68 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -22,6 +22,7 @@ use leonverschuren\Lenex\Model\Contact; use leonverschuren\Lenex\Model\Entry; use leonverschuren\Lenex\Model\Event; +use leonverschuren\Lenex\Model\Facility; use leonverschuren\Lenex\Model\Fee; use leonverschuren\Lenex\Model\Handicap; use leonverschuren\Lenex\Model\Heat; @@ -34,12 +35,16 @@ use leonverschuren\Lenex\Model\Pool; use leonverschuren\Lenex\Model\Qualify; use leonverschuren\Lenex\Model\Ranking; +use leonverschuren\Lenex\Model\Record; +use leonverschuren\Lenex\Model\RecordList; use leonverschuren\Lenex\Model\Relay; use leonverschuren\Lenex\Model\RelayPosition; use leonverschuren\Lenex\Model\Result; use leonverschuren\Lenex\Model\Session; use leonverschuren\Lenex\Model\Split; use leonverschuren\Lenex\Model\SwimStyle; +use leonverschuren\Lenex\Model\TimeStandard; +use leonverschuren\Lenex\Model\TimeStandardList; use leonverschuren\Lenex\Model\TimeStandardRef; use SimpleXMLElement; use Symfony\Component\PropertyAccess\PropertyAccess; @@ -47,11 +52,9 @@ class Parser { - /** @var PropertyAccessorInterface */ - private $accessor; + private ?\Symfony\Component\PropertyAccess\PropertyAccessor $accessor = null; /** - * @param SimpleXMLElement $document * @return Lenex */ public function parseResult(SimpleXMLElement $document) @@ -71,9 +74,11 @@ public function extractLenex(SimpleXMLElement $document) 'MEETS' => function (Lenex $object, $value) { $object->setMeets($this->extractMeets($value)); }, - 'RECORDLISTS' => function () { + 'RECORDLISTS' => function (Lenex $object, $value) { +// $object->setRecordLists($this->extractRecordLists($value)); }, - 'TIMESTANDARDLIST' => function () { + 'TIMESTANDARDLISTS' => function (Lenex $object, $value) { + $object->setTimeStandardLists($this->extractTimeStandardLists($value)); }, 'version' => 'version', ]; @@ -81,9 +86,95 @@ public function extractLenex(SimpleXMLElement $document) return $this->transform($document, $fields, $object); } + private function extractRecords(SimpleXMLElement $element): array + { + $records = []; + + foreach ($element->RECORD as $recordElement) { + $record = new Record(); + $record->setAthleteName((string)$recordElement['athletename']); + $record->setBirthDate(new DateTime((string)$recordElement['birthdate'])); + $record->setValue((string)$recordElement['value']); + // ... остальные поля + + $records[] = $record; + } + + return $records; + } + + /** + * @return TimeStandardList[] + */ + private function extractTimeStandardLists(SimpleXMLElement $document): array + { + $objects = []; + + foreach ($document->TIMESTANDARDLIST as $timeStandardList) { + $objects[] = $this->extractTimeStandardList($timeStandardList); + } + + return $objects; + } + + /** + * @return TimeStandardList + */ + public function extractTimeStandardList(SimpleXMLElement $document) + { + $object = new TimeStandardList(); + + $fields = [ + 'AGEGROUP' => function (TimeStandardList $object, $value) { + $object->setAgeGroup($this->extractAgeGroup($value)); + }, + 'code' => 'code', + 'gender' => 'gender', + 'course' => 'course', + 'handicap' => 'handicap', + 'name' => 'name', + 'timestandardlistid' => 'timestandardlistid', + 'type' => 'type', + 'TIMESTANDARDS' => function (TimeStandardList $object, $value) { + $object->setTimeStandards($this->extractTimeStandards($value)); + }, + ]; + + return $this->transform($document, $fields, $object); + } + + /** + * @return TimeStandard[] + */ + private function extractTimeStandards(SimpleXMLElement $document): array + { + $objects = []; + + foreach ($document->TIMESTANDARD as $timeStandard) { + $objects[] = $this->extractTimeStandard($timeStandard); + } + + return $objects; + } + + /** + * @return TimeStandard + */ + public function extractTimeStandard(SimpleXMLElement $document) + { + $object = new TimeStandard(); + + $fields = [ + 'SWIMSTYLE' => function (TimeStandard $object, $value) { + $object->setSwimStyle($this->extractSwimStyle($value)); + }, + 'swimtime' => 'swimtime', + ]; + + return $this->transform($document, $fields, $object); + } /** - * @param SimpleXMLElement $document * @return Constructor */ public function extractConstructor(SimpleXMLElement $document) @@ -104,7 +195,6 @@ public function extractConstructor(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Contact */ public function extractContact(SimpleXMLElement $document) @@ -131,7 +221,6 @@ public function extractContact(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Meet[] */ public function extractMeets(SimpleXMLElement $document) @@ -145,9 +234,24 @@ public function extractMeets(SimpleXMLElement $document) return $objects; } + private function extractRecordLists(SimpleXMLElement $element): array + { + $recordLists = []; + + foreach ($element->RECORDLIST as $recordListElement) { + $recordList = new RecordList(); + $recordList->setType((string)$recordListElement['type']); + $recordList->setCourse((string)$recordListElement['course']); + $recordList->setRecords($this->extractRecords($recordListElement)); + + $recordLists[] = $recordList; + } + + return $recordLists; + } + /** - * @param SimpleXMLElement $document * @return Meet */ public function extractMeet(SimpleXMLElement $document) @@ -194,6 +298,9 @@ public function extractMeet(SimpleXMLElement $document) 'POOL' => function (Meet $object, $value) { $object->setPool($this->extractPool($value)); }, + 'FACILITY' => function (Meet $object, $value) { + $object->setFacility($this->extractFacility($value)); + }, 'QUALIFY' => function (Meet $object, $value) { $object->setQualify($this->extractQualify($value)); }, @@ -217,7 +324,6 @@ public function extractMeet(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return AgeDate */ public function extractAgeDate(SimpleXMLElement $document) @@ -235,7 +341,6 @@ public function extractAgeDate(SimpleXMLElement $document) } /** - * @param SimpleXMLElement $document * @return Club[] */ public function extractClubs(SimpleXMLElement $document) @@ -251,7 +356,6 @@ public function extractClubs(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Club */ public function extractClub(SimpleXMLElement $document) @@ -281,6 +385,7 @@ public function extractClub(SimpleXMLElement $document) 'shortname.en' => 'shortNameEn', 'swrid' => 'swrId', 'type' => 'type', + 'clubid' => 'clubid', ]; return $this->transform($document, $fields, $object); @@ -288,7 +393,6 @@ public function extractClub(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Athlete[] */ public function extractAthletes(SimpleXMLElement $document) @@ -304,7 +408,6 @@ public function extractAthletes(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Athlete */ public function extractAthlete(SimpleXMLElement $document) @@ -346,7 +449,6 @@ public function extractAthlete(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Entry[] */ public function extractEntries(SimpleXMLElement $document) @@ -362,7 +464,6 @@ public function extractEntries(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Entry */ public function extractEntry(SimpleXMLElement $document) @@ -390,7 +491,6 @@ public function extractEntry(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return MeetInfo */ public function extractMeetInfo(SimpleXMLElement $document) @@ -417,7 +517,6 @@ public function extractMeetInfo(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return RelayPosition[] */ public function extractRelayPositions(SimpleXMLElement $document) @@ -433,7 +532,6 @@ public function extractRelayPositions(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return RelayPosition */ public function extractRelayPosition(SimpleXMLElement $document) @@ -458,7 +556,6 @@ public function extractRelayPosition(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Handicap */ public function extractHandicap(SimpleXMLElement $document) @@ -477,7 +574,6 @@ public function extractHandicap(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Result[] */ public function extractResults(SimpleXMLElement $document) @@ -493,7 +589,6 @@ public function extractResults(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Result */ public function extractResult(SimpleXMLElement $document) @@ -516,6 +611,9 @@ public function extractResult(SimpleXMLElement $document) $object->setSplits($this->extractSplits($value)); }, 'swimtime' => 'swimTime', + 'entrytime' => 'entryTime', + 'entrycourse' => 'entryCourse', + 'late' => 'late', ]; return $this->transform($document, $fields, $object); @@ -523,7 +621,6 @@ public function extractResult(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Split[] */ public function extractSplits(SimpleXMLElement $document) @@ -539,7 +636,6 @@ public function extractSplits(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Split */ public function extractSplit(SimpleXMLElement $document) @@ -556,7 +652,6 @@ public function extractSplit(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Official[] */ public function extractOfficials(SimpleXMLElement $document) @@ -572,7 +667,6 @@ public function extractOfficials(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Official */ public function extractOfficial(SimpleXMLElement $document) @@ -599,7 +693,6 @@ public function extractOfficial(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Official[] */ public function extractRelays(SimpleXMLElement $document) @@ -615,7 +708,6 @@ public function extractRelays(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Relay */ public function extractRelay(SimpleXMLElement $document) @@ -650,7 +742,6 @@ public function extractRelay(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Fee[] */ public function extractFees(SimpleXMLElement $document) @@ -666,7 +757,6 @@ public function extractFees(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Fee */ public function extractFee(SimpleXMLElement $document) @@ -684,7 +774,6 @@ public function extractFee(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return PointTable */ public function extractPointTable(SimpleXMLElement $document) @@ -701,7 +790,6 @@ public function extractPointTable(SimpleXMLElement $document) } /** - * @param SimpleXMLElement $document * @return Pool */ public function extractPool(SimpleXMLElement $document) @@ -719,9 +807,28 @@ public function extractPool(SimpleXMLElement $document) return $this->transform($document, $fields, $object); } + /** + * @return Pool + */ + public function extractFacility(SimpleXMLElement $document) + { + $object = new Facility(); + + $fields = [ + 'name' => 'name', + 'city' => 'city', + 'nation' => 'nation', + 'state' => 'state', + 'street' => 'street', + 'street2' => 'street2', + 'zip' => 'zip', + ]; + + return $this->transform($document, $fields, $object); + } + /** - * @param SimpleXMLElement $document * @return Qualify */ public function extractQualify(SimpleXMLElement $document) @@ -740,7 +847,6 @@ public function extractQualify(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Session[] */ public function extractSessions(SimpleXMLElement $document) @@ -756,7 +862,6 @@ public function extractSessions(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Session */ public function extractSession(SimpleXMLElement $document) @@ -799,7 +904,6 @@ public function extractSession(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Event[] */ public function extractEvents(SimpleXMLElement $document) @@ -815,7 +919,6 @@ public function extractEvents(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Event */ public function extractEvent(SimpleXMLElement $document) @@ -856,7 +959,6 @@ public function extractEvent(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return AgeGroup[] */ public function extractAgeGroups(SimpleXMLElement $document) @@ -896,7 +998,6 @@ public function extractAgeGroup(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Ranking[] */ public function extractRankings(SimpleXMLElement $document) @@ -911,7 +1012,6 @@ public function extractRankings(SimpleXMLElement $document) } /** - * @param SimpleXMLElement $document * @return Ranking */ public function extractRanking(SimpleXMLElement $document) @@ -929,7 +1029,6 @@ public function extractRanking(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Judge[] */ public function extractJudges(SimpleXMLElement $document) @@ -945,7 +1044,6 @@ public function extractJudges(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Judge */ public function extractJudge(SimpleXMLElement $document) @@ -963,7 +1061,6 @@ public function extractJudge(SimpleXMLElement $document) } /** - * @param SimpleXMLElement $document * @return Heat[] */ public function extractHeats(SimpleXMLElement $document) @@ -979,7 +1076,6 @@ public function extractHeats(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return Heat */ public function extractHeat(SimpleXMLElement $document) @@ -1000,7 +1096,6 @@ public function extractHeat(SimpleXMLElement $document) } /** - * @param SimpleXMLElement $document * @return SwimStyle */ public function extractSwimStyle(SimpleXMLElement $document) @@ -1022,7 +1117,6 @@ public function extractSwimStyle(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return TimeStandardRef[] */ public function extractTimeStandardRefs(SimpleXMLElement $document) @@ -1038,7 +1132,6 @@ public function extractTimeStandardRefs(SimpleXMLElement $document) /** - * @param SimpleXMLElement $document * @return TimeStandardRef */ public function extractTimeStandardRef(SimpleXMLElement $document) diff --git a/src/Reader.php b/src/Reader.php index 7419363..69337fd 100644 --- a/src/Reader.php +++ b/src/Reader.php @@ -39,16 +39,11 @@ protected function guessMimeType($path) protected function readByMimeType($path, $mimeType) { - switch ($mimeType) { - case 'application/zip': - return $this->readFromArchive($path); - case 'text/xml': - return simplexml_load_file($path); - case 'application/xml': - return simplexml_load_file($path); - default: - throw new Exception('The mime type "'.$mimeType.'" is not supported'); - } + return match ($mimeType) { + 'application/zip' => $this->readFromArchive($path), + 'text/xml', 'application/xml' => simplexml_load_file($path), + default => throw new Exception('The mime type "'.$mimeType.'" is not supported'), + }; } diff --git a/src/Recorder.php b/src/Recorder.php new file mode 100644 index 0000000..e583c11 --- /dev/null +++ b/src/Recorder.php @@ -0,0 +1,26 @@ +asXML($path); + } + + public function archive(string $path, string $archivePath = 'archive.lxf'): bool + { + $zip = new ZipArchive(); + + if ($zip->open($archivePath, ZipArchive::CREATE) === TRUE) { + $zip->addFile($path, basename($path)); + $zip->close(); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/tests/Parser/ConverterTest.php b/tests/Parser/ConverterTest.php new file mode 100644 index 0000000..289e78a --- /dev/null +++ b/tests/Parser/ConverterTest.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Parser; + +use leonverschuren\Lenex\Parser; +use leonverschuren\Lenex\Converter; +use PHPUnit\Framework\TestCase; + +class ConverterTest extends TestCase +{ + public function testXmlGeneration() + { + $xml = simplexml_load_file(__DIR__ . '/final.lef'); + $parser = new Parser(); + + $lenex = $parser->parseResult($xml); + + $converter = new Converter(); + + $generatedXml = $converter->convert($lenex)->asXML(); + + $expectedXml = file_get_contents(__DIR__ . '/final.lef'); + + $this->assertXmlStringEqualsXmlString($expectedXml, $generatedXml); + + } +} diff --git a/tests/Parser/ParserTest.php b/tests/Parser/ParserTest.php index 6504469..83cd626 100644 --- a/tests/Parser/ParserTest.php +++ b/tests/Parser/ParserTest.php @@ -21,8 +21,9 @@ use leonverschuren\Lenex\Model\Session; use leonverschuren\Lenex\Model\SwimStyle; use leonverschuren\Lenex\Parser; +use PHPUnit\Framework\TestCase; -class ParserTest extends PHPUnit_Framework_TestCase +class ParserTest extends TestCase { public function testExtractLenex() { diff --git a/tests/Parser/ReaderTest.php b/tests/Parser/ReaderTest.php index 75995c5..9fdfeb7 100644 --- a/tests/Parser/ReaderTest.php +++ b/tests/Parser/ReaderTest.php @@ -11,8 +11,9 @@ */ use leonverschuren\Lenex\Reader; +use PHPUnit\Framework\TestCase; -class ReaderTest extends PHPUnit_Framework_TestCase +class ReaderTest extends TestCase { public function testReadLxf() {