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