added more columns to spreadsheet exports (#2413)

This commit is contained in:
Kevin Papst
2021-03-08 18:32:11 +01:00
committed by GitHub
parent 30ac5e4c24
commit 0b7d551048
13 changed files with 321 additions and 9 deletions

View File

@@ -49,7 +49,6 @@ use Symfony\Component\Validator\Constraints as Assert;
* *
* @Exporter\Order({"id", "name", "project", "budget", "timeBudget", "color", "visible", "comment"}) * @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("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 class Activity implements EntityWithMetaFields
{ {
@@ -368,7 +367,22 @@ class Activity implements EntityWithMetaFields
{ {
if ($this->id) { if ($this->id) {
$this->id = null; $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);
} }
} }
} }

View File

@@ -632,4 +632,27 @@ class Customer implements EntityWithMetaFields
{ {
return $this->getName(); 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);
}
}
} }

View File

@@ -531,8 +531,22 @@ class Project implements EntityWithMetaFields
{ {
if ($this->id) { if ($this->id) {
$this->id = null; $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);
} }
} }
} }

View File

@@ -166,8 +166,6 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface
*/ */
private $user; private $user;
/** /**
* Activity
*
* @var Activity * @var Activity
* *
* @Serializer\Expose() * @Serializer\Expose()
@@ -180,8 +178,6 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface
*/ */
private $activity; private $activity;
/** /**
* Project
*
* @var Project * @var Project
* *
* @Serializer\Expose() * @Serializer\Expose()
@@ -727,6 +723,13 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface
$timesheet->setMetaField(clone $meta); $timesheet->setMetaField(clone $meta);
} }
$timesheet->tags = new ArrayCollection();
/** @var Tag $tag */
foreach ($this->tags as $tag) {
$timesheet->addTag($tag);
}
return $timesheet; return $timesheet;
} }
@@ -734,7 +737,24 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface
{ {
if ($this->id) { if ($this->id) {
$this->id = null; $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);
} }
} }
} }

View File

@@ -90,6 +90,11 @@ abstract class AbstractSpreadsheetRenderer
'project-meta' => [], 'project-meta' => [],
'activity-meta' => [], 'activity-meta' => [],
'user-meta' => [], 'user-meta' => [],
'type' => [],
'category' => [],
'customer_number' => [],
'customer_vat' => [],
'order_number' => [],
]; ];
public function __construct(TranslatorInterface $translator, LocaleFormatExtensions $dateExtension, EventDispatcherInterface $dispatcher, AuthorizationCheckerInterface $voter) 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) { if (!$showRates) {
$removes = ['rate', 'fixedRate', 'hourlyRate', 'rate_internal']; $removes = ['rate', 'fixedRate', 'hourlyRate', 'rate_internal'];
foreach ($removes as $removeMe) { foreach ($removes as $removeMe) {

View File

@@ -158,4 +158,45 @@ class ActivityTest extends TestCase
self::assertEquals($item[1], $column->getType()); 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());
}
} }

View File

@@ -211,4 +211,35 @@ class CustomerTest extends TestCase
self::assertEquals($item[1], $column->getType()); 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());
}
} }

View File

@@ -185,4 +185,45 @@ class ProjectTest extends TestCase
self::assertEquals($item[1], $column->getType()); 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());
}
} }

View File

@@ -172,4 +172,39 @@ class TimesheetTest extends TestCase
$sut->setCategory('foo'); $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());
}
} }

View File

@@ -72,11 +72,14 @@ abstract class AbstractRendererTest extends KernelTestCase
{ {
$customer = new Customer(); $customer = new Customer();
$customer->setName('Customer Name'); $customer->setName('Customer Name');
$customer->setNumber('A-0123456789');
$customer->setVatId('DE-9876543210');
$customer->setMetaField((new CustomerMeta())->setName('customer-foo')->setValue('customer-bar')->setIsVisible(true)); $customer->setMetaField((new CustomerMeta())->setName('customer-foo')->setValue('customer-bar')->setIsVisible(true));
$project = new Project(); $project = new Project();
$project->setName('project name'); $project->setName('project name');
$project->setCustomer($customer); $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-bar')->setValue('project-bar')->setIsVisible(true));
$project->setMetaField((new ProjectMeta())->setName('project-foo2')->setValue('project-foo2')->setIsVisible(true)); $project->setMetaField((new ProjectMeta())->setName('project-foo2')->setValue('project-foo2')->setIsVisible(true));

View File

@@ -100,6 +100,11 @@ class CsvRendererTest extends AbstractRendererTest
19 => '', 19 => '',
20 => 'project-foo2', 20 => 'project-foo2',
21 => 'activity-bar', 21 => 'activity-bar',
22 => 'timesheet',
23 => 'work',
24 => 'A-0123456789',
25 => 'DE-9876543210',
26 => 'ORDER-123',
]; ];
self::assertEquals(7, \count($all)); self::assertEquals(7, \count($all));

View File

@@ -71,11 +71,14 @@ abstract class AbstractRendererTest extends KernelTestCase
{ {
$customer = new Customer(); $customer = new Customer();
$customer->setName('Customer Name'); $customer->setName('Customer Name');
$customer->setNumber('A-0123456789');
$customer->setVatId('DE-9876543210');
$customer->setMetaField((new CustomerMeta())->setName('customer-foo')->setValue('customer-bar')->setIsVisible(true)); $customer->setMetaField((new CustomerMeta())->setName('customer-foo')->setValue('customer-bar')->setIsVisible(true));
$project = new Project(); $project = new Project();
$project->setName('project name'); $project->setName('project name');
$project->setCustomer($customer); $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-bar')->setValue('project-bar')->setIsVisible(true));
$project->setMetaField((new ProjectMeta())->setName('project-foo2')->setValue('project-foo2')->setIsVisible(true)); $project->setMetaField((new ProjectMeta())->setName('project-foo2')->setValue('project-foo2')->setIsVisible(true));

View File

@@ -97,6 +97,11 @@ class CsvRendererTest extends AbstractRendererTest
19 => '', 19 => '',
20 => 'project-foo2', 20 => 'project-foo2',
21 => 'activity-bar', 21 => 'activity-bar',
22 => 'timesheet',
23 => 'work',
24 => 'A-0123456789',
25 => 'DE-9876543210',
26 => 'ORDER-123',
]; ];
self::assertEquals(7, \count($all)); self::assertEquals(7, \count($all));