getParameter('kernel.project_dir'); /** @var SeasonCalendar $seasonCalendar */ $seasonCalendar = static::getContainer()->get(SeasonCalendar::class); $exporter = new FeedbackExporter($seasonCalendar); $author = (new User())->setFirstName('Carmen')->setLastName('Bär'); $teamerMueller = (new Teamer())->setFirstName('Mara')->setLastName('Müller'); $teamerSchmidt = (new Teamer())->setFirstName('Timo')->setLastName('Schmidt'); $guideSet = (new FeedbackSet())->setName('Reiseleiter-Feedback'); $careSet = (new FeedbackSet())->setName('Betreuer-Feedback'); // Müller, season 2024/25, guide set - full question list. $first = $this->makeFeedback($author, $teamerMueller, $guideSet, new \DateTimeImmutable('2024-12-01'), [ ['rating' => 'Pünktlichkeit', 'mark' => 5], ['rating' => 'Freundlichkeit', 'mark' => 4], ]); $first->setComment('Alles bestens'); // Müller again, same season, guide set - extra question the first row lacks. $second = $this->makeFeedback($author, $teamerMueller, $guideSet, new \DateTimeImmutable('2025-02-20'), [ ['rating' => 'Pünktlichkeit', 'mark' => 3], ['rating' => 'Freundlichkeit', 'mark' => 4], ['rating' => 'Sprachkenntnisse', 'mark' => 2], ]); // Schmidt, care set, no assignment date -> season falls back to a dash. $third = $this->makeFeedback($author, $teamerSchmidt, $careSet, null, [ ['rating' => 'Organisation', 'mark' => 4], ]); $spreadsheet = $exporter->export([$first, $second, $third]); self::assertSame(2, $spreadsheet->getSheetCount()); self::assertSame('Reiseleiter-Feedback', $spreadsheet->getSheet(0)->getTitle()); self::assertSame('Betreuer-Feedback', $spreadsheet->getSheet(1)->getTitle()); $guideSheet = $spreadsheet->getSheet(0); $header = $guideSheet->rangeToArray('A1:Q1')[0]; self::assertSame('Name', $header[0]); self::assertSame('Saison', $header[2]); // Fixed block is 11 columns (A-K); questions follow in first-seen order. self::assertSame('Pünktlichkeit', $header[11]); self::assertSame('Freundlichkeit', $header[12]); self::assertSame('Sprachkenntnisse', $header[13]); self::assertSame('Ø Bewertung', $header[14]); self::assertSame('Kommentar (öffentlich)', $header[15]); self::assertSame('Kommentar (intern)', $header[16]); // Row 2 = first Müller feedback: mark present, missing question is blank. self::assertSame('Müller', $guideSheet->getCell('A2')->getValue()); self::assertSame('Saison 2024/25', $guideSheet->getCell('C2')->getValue()); self::assertSame(5, $guideSheet->getCell('L2')->getValue()); self::assertSame(4, $guideSheet->getCell('M2')->getValue()); self::assertNull($guideSheet->getCell('N2')->getValue()); self::assertSame(4.5, $guideSheet->getCell('O2')->getValue()); self::assertSame('Alles bestens', $guideSheet->getCell('P2')->getValue()); // Row 3 = second Müller feedback: the third question now carries a mark. self::assertSame(2, $guideSheet->getCell('N3')->getValue()); $careSheet = $spreadsheet->getSheet(1); self::assertSame('—', $careSheet->getCell('C2')->getValue()); self::assertSame('Organisation', $careSheet->rangeToArray('A1:O1')[0][11]); (new Xlsx($spreadsheet))->save($projectDir.'/temp/feedback-export.xlsx'); } /** * @param list $ratings */ private function makeFeedback( User $author, Teamer $teamer, FeedbackSet $set, ?\DateTimeImmutable $dateFrom, array $ratings, ): Feedback { $feedback = (new Feedback($author)) ->setStatus(Feedback::STATUS_PUBLISHED) ->setTeamer($teamer) ->setFeedbackSet($set) ->setDestinationName('Skireise') ->setHotel('Unterkunft') ->setHotelCode('ABC123') ->setJobProfileName('Allrounder') ->setRatings($ratings) ; $feedback->setCreatedAt(new \DateTimeImmutable('2025-03-01')); $feedback->setAverageRating(); if (null !== $dateFrom) { $feedback ->setAssignmentDateFrom($dateFrom) ->setAssignmentDateTo($dateFrom->modify('+2 months')) ; } return $feedback; } }