diff --git a/src/Invoice/Calculator/DateInvoiceCalculator.php b/src/Invoice/Calculator/DateInvoiceCalculator.php new file mode 100644 index 00000000..9ba020af --- /dev/null +++ b/src/Invoice/Calculator/DateInvoiceCalculator.php @@ -0,0 +1,32 @@ +getBegin()->format('Y-m-d'); + } + + /** + * @return string + */ + public function getId(): string + { + return 'date'; + } +} diff --git a/tests/Invoice/Calculator/DateInvoiceCalculatorTest.php b/tests/Invoice/Calculator/DateInvoiceCalculatorTest.php new file mode 100644 index 00000000..51637bae --- /dev/null +++ b/tests/Invoice/Calculator/DateInvoiceCalculatorTest.php @@ -0,0 +1,148 @@ +assertEmptyModel(new DateInvoiceCalculator()); + } + + public function testWithMultipleEntries() + { + $customer = new Customer(); + $template = new InvoiceTemplate(); + $template->setVat(19); + + $user = $this->getMockBuilder(User::class)->setMethods(['getId'])->disableOriginalConstructor()->getMock(); + $user->method('getId')->willReturn(1); + + $project1 = $this->getMockBuilder(Project::class)->setMethods(['getId'])->disableOriginalConstructor()->getMock(); + $project1->method('getId')->willReturn(1); + + $project2 = $this->getMockBuilder(Project::class)->setMethods(['getId'])->disableOriginalConstructor()->getMock(); + $project2->method('getId')->willReturn(2); + + $project3 = $this->getMockBuilder(Project::class)->setMethods(['getId'])->disableOriginalConstructor()->getMock(); + $project3->method('getId')->willReturn(3); + + $timesheet = new Timesheet(); + $timesheet + ->setBegin(new DateTime('2018-11-29')) + ->setEnd(new DateTime()) + ->setDuration(3600) + ->setRate(293.27) + ->setUser($user) + ->setActivity((new Activity())->setName('sdsd')) + ->setProject($project1); + + $timesheet2 = new Timesheet(); + $timesheet2 + ->setBegin(new DateTime('2018-11-29')) + ->setEnd(new DateTime()) + ->setDuration(400) + ->setRate(84.75) + ->setUser($user) + ->setActivity((new Activity())->setName('bar')) + ->setProject($project2); + + $timesheet3 = new Timesheet(); + $timesheet3 + ->setBegin(new DateTime('2018-11-28')) + ->setEnd(new DateTime()) + ->setDuration(1800) + ->setRate(111.11) + ->setUser($user) + ->setActivity((new Activity())->setName('foo')) + ->setProject($project1); + + $timesheet4 = new Timesheet(); + $timesheet4 + ->setBegin(new DateTime()) + ->setEnd(new DateTime('2018-11-28')) + ->setDuration(400) + ->setRate(1947.99) + ->setUser($user) + ->setActivity((new Activity())->setName('blub')) + ->setProject($project2); + + $timesheet5 = new Timesheet(); + $timesheet5 + ->setBegin(new DateTime('2018-11-28')) + ->setEnd(new DateTime()) + ->setDuration(400) + ->setRate(84) + ->setUser(new User()) + ->setActivity(new Activity()) + ->setProject($project3); + + $entries = [$timesheet, $timesheet2, $timesheet3, $timesheet4, $timesheet5]; + + $query = new InvoiceQuery(); + $query->setProject($project1); + + $model = new InvoiceModel(); + $model->setCustomer($customer); + $model->setTemplate($template); + $model->setEntries($entries); + $model->setQuery($query); + + $sut = new DateInvoiceCalculator(); + $sut->setModel($model); + + $this->assertEquals('date', $sut->getId()); + $this->assertEquals(3000.13, $sut->getTotal()); + $this->assertEquals(19, $sut->getVat()); + $this->assertEquals('EUR', $sut->getCurrency()); + $this->assertEquals(2521.12, $sut->getSubtotal()); + $this->assertEquals(6600, $sut->getTimeWorked()); + $this->assertEquals(3, count($sut->getEntries())); + + $entries = $sut->getEntries(); + self::assertCount(3, $entries); + $this->assertEquals(378.02, $entries[0]->getRate()); + $this->assertEquals(195.11, $entries[1]->getRate()); + $this->assertEquals(1947.99, $entries[2]->getRate()); + self::assertEquals(2521.12, $entries[0]->getRate() + $entries[1]->getRate() + $entries[2]->getRate()); + } + + public function testDescriptionByTimesheet() + { + $this->assertDescription(new DateInvoiceCalculator(), false, false); + } + + public function testDescriptionByActivity() + { + $this->assertDescription(new DateInvoiceCalculator(), false, true); + } + + public function testDescriptionByProject() + { + $this->assertDescription(new DateInvoiceCalculator(), true, false); + } +} diff --git a/tests/Invoice/Calculator/ProjectInvoiceCalculatorTest.php b/tests/Invoice/Calculator/ProjectInvoiceCalculatorTest.php index 47c1d130..d9a0de94 100644 --- a/tests/Invoice/Calculator/ProjectInvoiceCalculatorTest.php +++ b/tests/Invoice/Calculator/ProjectInvoiceCalculatorTest.php @@ -18,6 +18,7 @@ use App\Entity\User; use App\Invoice\Calculator\ProjectInvoiceCalculator; use App\Model\InvoiceModel; use App\Repository\Query\InvoiceQuery; +use DateTime; /** * @covers \App\Invoice\Calculator\ProjectInvoiceCalculator @@ -52,8 +53,8 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest $timesheet = new Timesheet(); $timesheet - ->setBegin(new \DateTime()) - ->setEnd(new \DateTime()) + ->setBegin(new DateTime()) + ->setEnd(new DateTime()) ->setDuration(3600) ->setRate(293.27) ->setUser($user) @@ -62,8 +63,8 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest $timesheet2 = new Timesheet(); $timesheet2 - ->setBegin(new \DateTime()) - ->setEnd(new \DateTime()) + ->setBegin(new DateTime()) + ->setEnd(new DateTime()) ->setDuration(400) ->setRate(84.75) ->setUser($user) @@ -72,8 +73,8 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest $timesheet3 = new Timesheet(); $timesheet3 - ->setBegin(new \DateTime()) - ->setEnd(new \DateTime()) + ->setBegin(new DateTime()) + ->setEnd(new DateTime()) ->setDuration(1800) ->setRate(111.11) ->setUser($user) @@ -82,8 +83,8 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest $timesheet4 = new Timesheet(); $timesheet4 - ->setBegin(new \DateTime()) - ->setEnd(new \DateTime()) + ->setBegin(new DateTime()) + ->setEnd(new DateTime()) ->setDuration(400) ->setRate(1947.99) ->setUser($user) @@ -92,8 +93,8 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest $timesheet5 = new Timesheet(); $timesheet5 - ->setBegin(new \DateTime()) - ->setEnd(new \DateTime()) + ->setBegin(new DateTime()) + ->setEnd(new DateTime()) ->setDuration(400) ->setRate(84) ->setUser(new User()) @@ -123,9 +124,11 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest $this->assertEquals(3, count($sut->getEntries())); $entries = $sut->getEntries(); + self::assertCount(3, $entries); $this->assertEquals(404.38, $entries[0]->getRate()); $this->assertEquals(2032.74, $entries[1]->getRate()); $this->assertEquals(84, $entries[2]->getRate()); + self::assertEquals(2521.12, $entries[0]->getRate() + $entries[1]->getRate() + $entries[2]->getRate()); } public function testDescriptionByTimesheet() diff --git a/translations/invoice-calculator.de.xliff b/translations/invoice-calculator.de.xliff index ae834fc6..9c8afecc 100644 --- a/translations/invoice-calculator.de.xliff +++ b/translations/invoice-calculator.de.xliff @@ -26,6 +26,10 @@ project Projekt: ein Eintrag pro Projekt + + date + Datum: ein Eintrag pro Tag (verwendet Startdatum) + diff --git a/translations/invoice-calculator.en.xliff b/translations/invoice-calculator.en.xliff index 138dbb71..11305784 100644 --- a/translations/invoice-calculator.en.xliff +++ b/translations/invoice-calculator.en.xliff @@ -26,6 +26,10 @@ project Project: one entry per project + + date + Date: one entry per day (uses start date) +