diff --git a/src/Entity/Project.php b/src/Entity/Project.php index 852b2183..4ed1b55f 100644 --- a/src/Entity/Project.php +++ b/src/Entity/Project.php @@ -36,7 +36,6 @@ class Project implements EntityWithMetaFields * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; - /** * @var Customer * @@ -45,7 +44,6 @@ class Project implements EntityWithMetaFields * @Assert\NotNull() */ private $customer; - /** * @var string * @@ -56,7 +54,6 @@ class Project implements EntityWithMetaFields * @Assert\Length(min=2, max=150) */ private $name; - /** * @var string * @@ -64,14 +61,18 @@ class Project implements EntityWithMetaFields * @Assert\Length(max=20) */ private $orderNumber; - + /** + * @var \DateTime + * + * @ORM\Column(name="order_date", type="datetime", nullable=true) + */ + private $orderDate; /** * @var string * * @ORM\Column(name="comment", type="text", nullable=true) */ private $comment; - /** * @var bool * @@ -172,32 +173,37 @@ class Project implements EntityWithMetaFields } /** - * @deprecated since 1.4 + * @deprecated since 1.4, use isVisible() instead */ public function getVisible(): bool { return $this->visible; } - /** - * @return string|null - */ public function getOrderNumber(): ?string { return $this->orderNumber; } - /** - * @param string $orderNumber - * @return Project - */ - public function setOrderNumber($orderNumber): Project + public function setOrderNumber(?string $orderNumber): Project { $this->orderNumber = $orderNumber; return $this; } + public function getOrderDate(): ?\DateTime + { + return $this->orderDate; + } + + public function setOrderDate(?\DateTime $orderDate): Project + { + $this->orderDate = $orderDate; + + return $this; + } + /** * @internal only here for symfony forms * @return Collection|MetaTableTypeInterface[] diff --git a/src/Form/ProjectEditForm.php b/src/Form/ProjectEditForm.php index ff8ce7df..5403801f 100644 --- a/src/Form/ProjectEditForm.php +++ b/src/Form/ProjectEditForm.php @@ -12,6 +12,7 @@ namespace App\Form; use App\Entity\Customer; use App\Entity\Project; use App\Form\Type\CustomerType; +use App\Form\Type\DateTimePickerType; use App\Repository\CustomerRepository; use App\Repository\Query\CustomerFormTypeQuery; use Symfony\Component\Form\AbstractType; @@ -58,6 +59,10 @@ class ProjectEditForm extends AbstractType 'label' => 'label.orderNumber', 'required' => false, ]) + ->add('orderDate', DateTimePickerType::class, [ + 'label' => 'label.orderDate', + 'required' => false, + ]) ->add('customer', CustomerType::class, [ 'query_builder' => function (CustomerRepository $repo) use ($builder, $customer) { $query = new CustomerFormTypeQuery($customer); diff --git a/src/Migrations/Version20191024100951.php b/src/Migrations/Version20191024100951.php new file mode 100644 index 00000000..4a226b51 --- /dev/null +++ b/src/Migrations/Version20191024100951.php @@ -0,0 +1,55 @@ +isPlatformSqlite()) { + // does fail if we use transactions, as tables are re-created and foreign keys would fail + return false; + } + + return true; + } + + public function up(Schema $schema): void + { + $projects = $schema->getTable('kimai2_projects'); + $projects->addColumn('order_date', 'datetime', ['notnull' => false]); + } + + public function down(Schema $schema): void + { + $projects = $schema->getTable('kimai2_projects'); + $projects->dropColumn('order_date'); + } +} diff --git a/tests/Entity/ProjectTest.php b/tests/Entity/ProjectTest.php index 9cd0736b..615515f5 100644 --- a/tests/Entity/ProjectTest.php +++ b/tests/Entity/ProjectTest.php @@ -24,22 +24,24 @@ class ProjectTest extends TestCase public function testDefaultValues() { $sut = new Project(); - $this->assertNull($sut->getId()); - $this->assertNull($sut->getCustomer()); - $this->assertNull($sut->getName()); - $this->assertNull($sut->getOrderNumber()); - $this->assertNull($sut->getComment()); - $this->assertTrue($sut->getVisible()); - $this->assertNull($sut->getFixedRate()); - $this->assertNull($sut->getHourlyRate()); - $this->assertNull($sut->getColor()); - $this->assertEquals(0.0, $sut->getBudget()); - $this->assertEquals(0, $sut->getTimeBudget()); - $this->assertInstanceOf(Collection::class, $sut->getMetaFields()); - $this->assertEquals(0, $sut->getMetaFields()->count()); - $this->assertNull($sut->getMetaField('foo')); - $this->assertInstanceOf(Collection::class, $sut->getTeams()); - $this->assertEquals(0, $sut->getTeams()->count()); + self::assertNull($sut->getId()); + self::assertNull($sut->getCustomer()); + self::assertNull($sut->getName()); + self::assertNull($sut->getOrderNumber()); + self::assertNull($sut->getOrderDate()); + self::assertNull($sut->getComment()); + self::assertTrue($sut->getVisible()); + self::assertTrue($sut->isVisible()); + self::assertNull($sut->getFixedRate()); + self::assertNull($sut->getHourlyRate()); + self::assertNull($sut->getColor()); + self::assertEquals(0.0, $sut->getBudget()); + self::assertEquals(0, $sut->getTimeBudget()); + self::assertInstanceOf(Collection::class, $sut->getMetaFields()); + self::assertEquals(0, $sut->getMetaFields()->count()); + self::assertNull($sut->getMetaField('foo')); + self::assertInstanceOf(Collection::class, $sut->getTeams()); + self::assertEquals(0, $sut->getTeams()->count()); } public function testSetterAndGetter() @@ -47,35 +49,41 @@ class ProjectTest extends TestCase $sut = new Project(); $customer = (new Customer())->setName('customer'); - $this->assertInstanceOf(Project::class, $sut->setCustomer($customer)); - $this->assertSame($customer, $sut->getCustomer()); + self::assertInstanceOf(Project::class, $sut->setCustomer($customer)); + self::assertSame($customer, $sut->getCustomer()); - $this->assertInstanceOf(Project::class, $sut->setName('123456789')); - $this->assertEquals('123456789', (string) $sut); + self::assertInstanceOf(Project::class, $sut->setName('123456789')); + self::assertEquals('123456789', (string) $sut); - $this->assertInstanceOf(Project::class, $sut->setOrderNumber('123456789')); - $this->assertEquals('123456789', $sut->getOrderNumber()); + self::assertInstanceOf(Project::class, $sut->setOrderNumber('123456789')); + self::assertEquals('123456789', $sut->getOrderNumber()); - $this->assertInstanceOf(Project::class, $sut->setComment('a comment')); - $this->assertEquals('a comment', $sut->getComment()); + $dateTime = new \DateTime('-1 year'); + self::assertInstanceOf(Project::class, $sut->setOrderDate($dateTime)); + self::assertSame($dateTime, $sut->getOrderDate()); + self::assertInstanceOf(Project::class, $sut->setOrderDate(null)); + self::assertNull($sut->getOrderDate()); - $this->assertInstanceOf(Project::class, $sut->setColor('#fffccc')); - $this->assertEquals('#fffccc', $sut->getColor()); + self::assertInstanceOf(Project::class, $sut->setComment('a comment')); + self::assertEquals('a comment', $sut->getComment()); - $this->assertInstanceOf(Project::class, $sut->setVisible(false)); - $this->assertFalse($sut->getVisible()); + self::assertInstanceOf(Project::class, $sut->setColor('#fffccc')); + self::assertEquals('#fffccc', $sut->getColor()); - $this->assertInstanceOf(Project::class, $sut->setFixedRate(13.47)); - $this->assertEquals(13.47, $sut->getFixedRate()); + self::assertInstanceOf(Project::class, $sut->setVisible(false)); + self::assertFalse($sut->getVisible()); - $this->assertInstanceOf(Project::class, $sut->setHourlyRate(99)); - $this->assertEquals(99, $sut->getHourlyRate()); + self::assertInstanceOf(Project::class, $sut->setFixedRate(13.47)); + self::assertEquals(13.47, $sut->getFixedRate()); - $this->assertInstanceOf(Project::class, $sut->setBudget(12345.67)); - $this->assertEquals(12345.67, $sut->getBudget()); + self::assertInstanceOf(Project::class, $sut->setHourlyRate(99)); + self::assertEquals(99, $sut->getHourlyRate()); - $this->assertInstanceOf(Project::class, $sut->setTimeBudget(937321)); - $this->assertEquals(937321, $sut->getTimeBudget()); + self::assertInstanceOf(Project::class, $sut->setBudget(12345.67)); + self::assertEquals(12345.67, $sut->getBudget()); + + self::assertInstanceOf(Project::class, $sut->setTimeBudget(937321)); + self::assertEquals(937321, $sut->getTimeBudget()); } public function testMetaFields() @@ -83,7 +91,7 @@ class ProjectTest extends TestCase $sut = new Project(); $meta = new ProjectMeta(); $meta->setName('foo')->setValue('bar')->setType('test'); - $this->assertInstanceOf(Project::class, $sut->setMetaField($meta)); + self::assertInstanceOf(Project::class, $sut->setMetaField($meta)); self::assertEquals(1, $sut->getMetaFields()->count()); $result = $sut->getMetaField('foo'); self::assertSame($result, $meta); @@ -91,7 +99,7 @@ class ProjectTest extends TestCase $meta2 = new ProjectMeta(); $meta2->setName('foo')->setValue('bar')->setType('test2'); - $this->assertInstanceOf(Project::class, $sut->setMetaField($meta2)); + self::assertInstanceOf(Project::class, $sut->setMetaField($meta2)); self::assertEquals(1, $sut->getMetaFields()->count()); self::assertCount(0, $sut->getVisibleMetaFields()); diff --git a/translations/messages.de.xliff b/translations/messages.de.xliff index 9a830b7c..3f04ca39 100644 --- a/translations/messages.de.xliff +++ b/translations/messages.de.xliff @@ -868,6 +868,10 @@ label.orderNumber Bestellnummer + + label.orderDate + Bestelldatum + label.invoice_tax_number USt-IdNr.: diff --git a/translations/messages.en.xliff b/translations/messages.en.xliff index 781b1b68..9988695f 100644 --- a/translations/messages.en.xliff +++ b/translations/messages.en.xliff @@ -868,6 +868,10 @@ label.orderNumber Order number + + label.orderDate + Order date + label.invoice_tax_number VAT no.: diff --git a/var/data/kimai_test.sqlite b/var/data/kimai_test.sqlite index 449c3cd8..c72080bf 100644 Binary files a/var/data/kimai_test.sqlite and b/var/data/kimai_test.sqlite differ