From 0b7d5510484498ea4bb801e86928642f38f87cd3 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Mon, 8 Mar 2021 18:32:11 +0100 Subject: [PATCH] added more columns to spreadsheet exports (#2413) --- src/Entity/Activity.php | 18 ++++- src/Entity/Customer.php | 23 ++++++ src/Entity/Project.php | 18 ++++- src/Entity/Timesheet.php | 30 ++++++-- .../Base/AbstractSpreadsheetRenderer.php | 77 +++++++++++++++++++ tests/Entity/ActivityTest.php | 41 ++++++++++ tests/Entity/CustomerTest.php | 31 ++++++++ tests/Entity/ProjectTest.php | 41 ++++++++++ tests/Entity/TimesheetTest.php | 35 +++++++++ .../Export/Renderer/AbstractRendererTest.php | 3 + tests/Export/Renderer/CsvRendererTest.php | 5 ++ .../Export/Timesheet/AbstractRendererTest.php | 3 + tests/Export/Timesheet/CsvRendererTest.php | 5 ++ 13 files changed, 321 insertions(+), 9 deletions(-) diff --git a/src/Entity/Activity.php b/src/Entity/Activity.php index f7c531cb..8c3a4140 100644 --- a/src/Entity/Activity.php +++ b/src/Entity/Activity.php @@ -49,7 +49,6 @@ use Symfony\Component\Validator\Constraints as Assert; * * @Exporter\Order({"id", "name", "project", "budget", "timeBudget", "color", "visible", "comment"}) * @Exporter\Expose("project", label="label.project", exp="object.getProject() === null ? null : object.getProject().getName()") - * @ Exporter\Expose("teams", label="label.team", exp="object.getTeams().toArray()", type="array") */ class Activity implements EntityWithMetaFields { @@ -368,7 +367,22 @@ class Activity implements EntityWithMetaFields { if ($this->id) { $this->id = null; - $this->meta = new ArrayCollection(); + } + + $currentTeams = $this->teams; + $this->teams = new ArrayCollection(); + /** @var Team $team */ + foreach ($currentTeams as $team) { + $this->addTeam($team); + } + + $currentMeta = $this->meta; + $this->meta = new ArrayCollection(); + /** @var ProjectMeta $meta */ + foreach ($currentMeta as $meta) { + $newMeta = clone $meta; + $newMeta->setEntity($this); + $this->setMetaField($newMeta); } } } diff --git a/src/Entity/Customer.php b/src/Entity/Customer.php index d6b759b3..276285e2 100644 --- a/src/Entity/Customer.php +++ b/src/Entity/Customer.php @@ -632,4 +632,27 @@ class Customer implements EntityWithMetaFields { return $this->getName(); } + + public function __clone() + { + if ($this->id) { + $this->id = null; + } + + $currentTeams = $this->teams; + $this->teams = new ArrayCollection(); + /** @var Team $team */ + foreach ($currentTeams as $team) { + $this->addTeam($team); + } + + $currentMeta = $this->meta; + $this->meta = new ArrayCollection(); + /** @var ProjectMeta $meta */ + foreach ($currentMeta as $meta) { + $newMeta = clone $meta; + $newMeta->setEntity($this); + $this->setMetaField($newMeta); + } + } } diff --git a/src/Entity/Project.php b/src/Entity/Project.php index d121b03b..ec5eda44 100644 --- a/src/Entity/Project.php +++ b/src/Entity/Project.php @@ -531,8 +531,22 @@ class Project implements EntityWithMetaFields { if ($this->id) { $this->id = null; - $this->teams = new ArrayCollection(); - $this->meta = new ArrayCollection(); + } + + $currentTeams = $this->teams; + $this->teams = new ArrayCollection(); + /** @var Team $team */ + foreach ($currentTeams as $team) { + $this->addTeam($team); + } + + $currentMeta = $this->meta; + $this->meta = new ArrayCollection(); + /** @var ProjectMeta $meta */ + foreach ($currentMeta as $meta) { + $newMeta = clone $meta; + $newMeta->setEntity($this); + $this->setMetaField($newMeta); } } } diff --git a/src/Entity/Timesheet.php b/src/Entity/Timesheet.php index de70c97d..e1b3d9a9 100644 --- a/src/Entity/Timesheet.php +++ b/src/Entity/Timesheet.php @@ -166,8 +166,6 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface */ private $user; /** - * Activity - * * @var Activity * * @Serializer\Expose() @@ -180,8 +178,6 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface */ private $activity; /** - * Project - * * @var Project * * @Serializer\Expose() @@ -727,6 +723,13 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface $timesheet->setMetaField(clone $meta); } + $timesheet->tags = new ArrayCollection(); + + /** @var Tag $tag */ + foreach ($this->tags as $tag) { + $timesheet->addTag($tag); + } + return $timesheet; } @@ -734,7 +737,24 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface { if ($this->id) { $this->id = null; - $this->exported = false; + } + + $this->exported = false; + + $currentMeta = $this->meta; + $this->meta = new ArrayCollection(); + /** @var TimesheetMeta $meta */ + foreach ($currentMeta as $meta) { + $newMeta = clone $meta; + $newMeta->setEntity($this); + $this->setMetaField($newMeta); + } + + $currentTags = $this->tags; + $this->tags = new ArrayCollection(); + /** @var Tag $tag */ + foreach ($currentTags as $tag) { + $this->addTag($tag); } } } diff --git a/src/Export/Base/AbstractSpreadsheetRenderer.php b/src/Export/Base/AbstractSpreadsheetRenderer.php index daa0ff1e..f1b3eb54 100644 --- a/src/Export/Base/AbstractSpreadsheetRenderer.php +++ b/src/Export/Base/AbstractSpreadsheetRenderer.php @@ -90,6 +90,11 @@ abstract class AbstractSpreadsheetRenderer 'project-meta' => [], 'activity-meta' => [], 'user-meta' => [], + 'type' => [], + 'category' => [], + 'customer_number' => [], + 'customer_vat' => [], + 'order_number' => [], ]; public function __construct(TranslatorInterface $translator, LocaleFormatExtensions $dateExtension, EventDispatcherInterface $dispatcher, AuthorizationCheckerInterface $voter) @@ -503,6 +508,78 @@ abstract class AbstractSpreadsheetRenderer ]; } + if (isset($columns['type']) && !isset($columns['type']['render'])) { + $columns['type']['render'] = function (Worksheet $sheet, int $row, int $column, ExportItemInterface $entity) { + $sheet->setCellValueByColumnAndRow($column, $row, $entity->getType()); + }; + } + + if (isset($columns['category']) && !isset($columns['category']['render'])) { + $columns['category']['render'] = function (Worksheet $sheet, int $row, int $column, ExportItemInterface $entity) { + $sheet->setCellValueByColumnAndRow($column, $row, $entity->getCategory()); + }; + } + + if (isset($columns['customer_number'])) { + if (!isset($columns['customer_number']['header'])) { + $columns['customer_number']['header'] = function (Worksheet $sheet, $row, $column) { + $sheet->setCellValueByColumnAndRow($column, $row, $this->translator->trans('label.number')); + + return 1; + }; + } + + if (!isset($columns['customer_number']['render'])) { + $columns['customer_number']['render'] = function (Worksheet $sheet, int $row, int $column, ExportItemInterface $entity) { + $customerId = ''; + if (null !== $entity->getProject()) { + $customerId = $entity->getProject()->getCustomer()->getNumber(); + } + $sheet->setCellValueByColumnAndRow($column, $row, $customerId); + }; + } + } + + if (isset($columns['customer_vat']) && !isset($columns['customer_vat']['render'])) { + if (!isset($columns['customer_vat']['header'])) { + $columns['customer_vat']['header'] = function (Worksheet $sheet, $row, $column) { + $sheet->setCellValueByColumnAndRow($column, $row, $this->translator->trans('label.vat_id')); + + return 1; + }; + } + + if (!isset($columns['customer_vat']['render'])) { + $columns['customer_vat']['render'] = function (Worksheet $sheet, int $row, int $column, ExportItemInterface $entity) { + $customerVat = ''; + if (null !== $entity->getProject()) { + $customerVat = $entity->getProject()->getCustomer()->getVatId(); + } + $sheet->setCellValueByColumnAndRow($column, $row, $customerVat); + }; + } + } + + if (isset($columns['order_number']) && !isset($columns['order_number']['render'])) { + if (!isset($columns['order_number']['header'])) { + $columns['order_number']['header'] = function (Worksheet $sheet, $row, $column) { + $sheet->setCellValueByColumnAndRow($column, $row, $this->translator->trans('label.orderNumber')); + + return 1; + }; + } + + if (!isset($columns['order_number']['render'])) { + $columns['order_number']['render'] = function (Worksheet $sheet, int $row, int $column, ExportItemInterface $entity) { + $orderNumber = ''; + if (null !== $entity->getProject()) { + $orderNumber = $entity->getProject()->getOrderNumber(); + } + $sheet->setCellValueByColumnAndRow($column, $row, $orderNumber); + }; + } + } + if (!$showRates) { $removes = ['rate', 'fixedRate', 'hourlyRate', 'rate_internal']; foreach ($removes as $removeMe) { diff --git a/tests/Entity/ActivityTest.php b/tests/Entity/ActivityTest.php index 08983fba..e2bccd21 100644 --- a/tests/Entity/ActivityTest.php +++ b/tests/Entity/ActivityTest.php @@ -158,4 +158,45 @@ class ActivityTest extends TestCase self::assertEquals($item[1], $column->getType()); } } + + public function testClone() + { + $sut = new Activity(); + $sut->setName('activity1111'); + $sut->setComment('DE-0123456789'); + + $project = new Project(); + $project->setName('foo'); + $project->setOrderNumber('1234567890'); + $project->setBudget(123.45); + $project->setTimeBudget(12345); + $project->setVisible(false); + $project->setEnd(new \DateTime()); + $project->setColor('#ccc'); + + $sut->setProject($project); + + $team = new Team(); + $sut->addTeam($team); + + $meta = new ActivityMeta(); + $meta->setName('blabla'); + $meta->setValue('1234567890'); + $meta->setIsVisible(false); + $meta->setIsRequired(true); + $sut->setMetaField($meta); + + $clone = clone $sut; + + foreach ($sut->getMetaFields() as $metaField) { + $cloneMeta = $clone->getMetaField($metaField->getName()); + self::assertEquals($cloneMeta->getValue(), $metaField->getValue()); + } + self::assertEquals($clone->getBudget(), $sut->getBudget()); + self::assertEquals($clone->getTimeBudget(), $sut->getTimeBudget()); + self::assertEquals($clone->getComment(), $sut->getComment()); + self::assertEquals($clone->getColor(), $sut->getColor()); + self::assertEquals('DE-0123456789', $clone->getComment()); + self::assertEquals('activity1111', $clone->getName()); + } } diff --git a/tests/Entity/CustomerTest.php b/tests/Entity/CustomerTest.php index 104fb6cc..bb2cb15c 100644 --- a/tests/Entity/CustomerTest.php +++ b/tests/Entity/CustomerTest.php @@ -211,4 +211,35 @@ class CustomerTest extends TestCase self::assertEquals($item[1], $column->getType()); } } + + public function testClone() + { + $sut = new Customer(); + $sut->setName('mycustomer'); + $sut->setVatId('DE-0123456789'); + $sut->setTimeBudget(123456); + $sut->setBudget(1234.56); + + $team = new Team(); + $sut->addTeam($team); + + $meta = new CustomerMeta(); + $meta->setName('blabla'); + $meta->setValue('1234567890'); + $meta->setIsVisible(false); + $meta->setIsRequired(true); + $sut->setMetaField($meta); + + $clone = clone $sut; + + foreach ($sut->getMetaFields() as $metaField) { + $cloneMeta = $clone->getMetaField($metaField->getName()); + self::assertEquals($cloneMeta->getValue(), $metaField->getValue()); + } + self::assertEquals($clone->getBudget(), $sut->getBudget()); + self::assertEquals($clone->getTimeBudget(), $sut->getTimeBudget()); + self::assertEquals($clone->getColor(), $sut->getColor()); + self::assertEquals('DE-0123456789', $clone->getVatId()); + self::assertEquals('mycustomer', $clone->getName()); + } } diff --git a/tests/Entity/ProjectTest.php b/tests/Entity/ProjectTest.php index 6236a858..334585dc 100644 --- a/tests/Entity/ProjectTest.php +++ b/tests/Entity/ProjectTest.php @@ -185,4 +185,45 @@ class ProjectTest extends TestCase self::assertEquals($item[1], $column->getType()); } } + + public function testClone() + { + $customer = new Customer(); + $customer->setName('prj-customer'); + $customer->setVatId('DE-0123456789'); + + $sut = new Project(); + $sut->setName('foo'); + $sut->setOrderNumber('1234567890'); + $sut->setBudget(123.45); + $sut->setTimeBudget(12345); + $sut->setVisible(false); + $sut->setEnd(new \DateTime()); + $sut->setColor('#ccc'); + + $sut->setCustomer($customer); + + $team = new Team(); + $sut->addTeam($team); + + $meta = new ProjectMeta(); + $meta->setName('blabla'); + $meta->setValue('1234567890'); + $meta->setIsVisible(false); + $meta->setIsRequired(true); + $sut->setMetaField($meta); + + $clone = clone $sut; + + foreach ($sut->getMetaFields() as $metaField) { + $cloneMeta = $clone->getMetaField($metaField->getName()); + self::assertEquals($cloneMeta->getValue(), $metaField->getValue()); + } + self::assertEquals($clone->getBudget(), $sut->getBudget()); + self::assertEquals($clone->getTimeBudget(), $sut->getTimeBudget()); + self::assertEquals($clone->getEnd(), $sut->getEnd()); + self::assertEquals($clone->getColor(), $sut->getColor()); + self::assertEquals('DE-0123456789', $clone->getCustomer()->getVatId()); + self::assertEquals('prj-customer', $clone->getCustomer()->getName()); + } } diff --git a/tests/Entity/TimesheetTest.php b/tests/Entity/TimesheetTest.php index bf5c41ea..8d9e338f 100644 --- a/tests/Entity/TimesheetTest.php +++ b/tests/Entity/TimesheetTest.php @@ -172,4 +172,39 @@ class TimesheetTest extends TestCase $sut->setCategory('foo'); } + + public function testClone() + { + $sut = new Timesheet(); + $sut->setExported(true); + $sut->setDescription('Invalid timesheet category "foo" given, expected one of: work, holiday, sickness, parental, overtime'); + + $meta = new TimesheetMeta(); + $meta->setName('blabla'); + $meta->setValue('1234567890'); + $meta->setIsVisible(false); + $meta->setIsRequired(true); + $sut->setMetaField($meta); + + $tag = new Tag(); + $tag->setName('bar'); + $sut->addTag($tag); + $tag = new Tag(); + $tag->setName('foo'); + $sut->addTag($tag); + + $clone = clone $sut; + + foreach ($sut->getMetaFields() as $metaField) { + $cloneMeta = $clone->getMetaField($metaField->getName()); + self::assertEquals($cloneMeta->getValue(), $metaField->getValue()); + } + self::assertEquals($clone->getTags(), $sut->getTags()); + self::assertEquals($clone->getTags(), $sut->getTags()); + self::assertEquals($clone->getTagsAsArray(), $sut->getTagsAsArray()); + self::assertEquals(['bar', 'foo'], $sut->getTagsAsArray()); + self::assertEquals($clone->getBegin(), $sut->getBegin()); + self::assertEquals($clone->getEnd(), $sut->getEnd()); + self::assertFalse($clone->isExported()); + } } diff --git a/tests/Export/Renderer/AbstractRendererTest.php b/tests/Export/Renderer/AbstractRendererTest.php index 1e96b764..a1da87fd 100644 --- a/tests/Export/Renderer/AbstractRendererTest.php +++ b/tests/Export/Renderer/AbstractRendererTest.php @@ -72,11 +72,14 @@ abstract class AbstractRendererTest extends KernelTestCase { $customer = new Customer(); $customer->setName('Customer Name'); + $customer->setNumber('A-0123456789'); + $customer->setVatId('DE-9876543210'); $customer->setMetaField((new CustomerMeta())->setName('customer-foo')->setValue('customer-bar')->setIsVisible(true)); $project = new Project(); $project->setName('project name'); $project->setCustomer($customer); + $project->setOrderNumber('ORDER-123'); $project->setMetaField((new ProjectMeta())->setName('project-bar')->setValue('project-bar')->setIsVisible(true)); $project->setMetaField((new ProjectMeta())->setName('project-foo2')->setValue('project-foo2')->setIsVisible(true)); diff --git a/tests/Export/Renderer/CsvRendererTest.php b/tests/Export/Renderer/CsvRendererTest.php index a8e8e683..476dab0c 100644 --- a/tests/Export/Renderer/CsvRendererTest.php +++ b/tests/Export/Renderer/CsvRendererTest.php @@ -100,6 +100,11 @@ class CsvRendererTest extends AbstractRendererTest 19 => '', 20 => 'project-foo2', 21 => 'activity-bar', + 22 => 'timesheet', + 23 => 'work', + 24 => 'A-0123456789', + 25 => 'DE-9876543210', + 26 => 'ORDER-123', ]; self::assertEquals(7, \count($all)); diff --git a/tests/Export/Timesheet/AbstractRendererTest.php b/tests/Export/Timesheet/AbstractRendererTest.php index 7dff9348..00f50860 100644 --- a/tests/Export/Timesheet/AbstractRendererTest.php +++ b/tests/Export/Timesheet/AbstractRendererTest.php @@ -71,11 +71,14 @@ abstract class AbstractRendererTest extends KernelTestCase { $customer = new Customer(); $customer->setName('Customer Name'); + $customer->setNumber('A-0123456789'); + $customer->setVatId('DE-9876543210'); $customer->setMetaField((new CustomerMeta())->setName('customer-foo')->setValue('customer-bar')->setIsVisible(true)); $project = new Project(); $project->setName('project name'); $project->setCustomer($customer); + $project->setOrderNumber('ORDER-123'); $project->setMetaField((new ProjectMeta())->setName('project-bar')->setValue('project-bar')->setIsVisible(true)); $project->setMetaField((new ProjectMeta())->setName('project-foo2')->setValue('project-foo2')->setIsVisible(true)); diff --git a/tests/Export/Timesheet/CsvRendererTest.php b/tests/Export/Timesheet/CsvRendererTest.php index e54a52ee..6e46fd7f 100644 --- a/tests/Export/Timesheet/CsvRendererTest.php +++ b/tests/Export/Timesheet/CsvRendererTest.php @@ -97,6 +97,11 @@ class CsvRendererTest extends AbstractRendererTest 19 => '', 20 => 'project-foo2', 21 => 'activity-bar', + 22 => 'timesheet', + 23 => 'work', + 24 => 'A-0123456789', + 25 => 'DE-9876543210', + 26 => 'ORDER-123', ]; self::assertEquals(7, \count($all));