added freelancer invoice template (#254)

This commit is contained in:
Kevin Papst
2018-09-02 21:29:49 +02:00
committed by GitHub
parent ee4df36735
commit a636faa4ab
41 changed files with 1105 additions and 145 deletions

View File

@@ -63,6 +63,59 @@ class InvoiceControllerTest extends ControllerBaseTest
$this->assertHasDataTable($client);
}
public function testCreateTemplateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);
$this->request($client, '/invoice/template/create');
$this->assertTrue($client->getResponse()->isSuccessful());
$form = $client->getCrawler()->filter('form[name=invoice_template_form]')->form();
$client->submit($form, [
'invoice_template_form' => [
'name' => 'Test',
'title' => 'Test invoice template',
'company' => 'Company name',
'renderer' => 'default',
'calculator' => 'default',
'numberGenerator' => 'default',
]
]);
$this->assertIsRedirect($client, $this->createUrl('/invoice/template'));
$client->followRedirect();
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertHasFlashSuccess($client);
}
public function testEditTemplateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);
$em = $client->getContainer()->get('doctrine.orm.entity_manager');
$fixture = new InvoiceFixtures();
$this->importFixture($em, $fixture);
$this->request($client, '/invoice/template/1/edit?page=1');
$form = $client->getCrawler()->filter('form[name=invoice_template_form]')->form();
$client->submit($form, [
'invoice_template_form' => [
'name' => 'Test 2!',
'title' => 'Test invoice template',
'company' => 'Company name',
'renderer' => 'default',
'calculator' => 'default',
'numberGenerator' => 'default',
]
]);
$this->assertIsRedirect($client, $this->createUrl('/invoice/template'));
$client->followRedirect();
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertHasFlashSuccess($client);
}
public function testDeleteTemplateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);

View File

@@ -7,7 +7,7 @@
* file that was distributed with this source code.
*/
namespace App\Tests\Voter;
namespace App\Tests\EventSubscriber;
use App\Entity\User;
use App\Event\DashboardEvent;

View File

@@ -7,7 +7,7 @@
* file that was distributed with this source code.
*/
namespace App\Tests\Voter;
namespace App\Tests\EventSubscriber;
use App\Entity\User;
use App\EventSubscriber\RegistrationSubscriber;

View File

@@ -0,0 +1,79 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Tests\Invoice;
use App\Entity\Customer;
use App\Entity\InvoiceTemplate;
use App\Entity\Timesheet;
use App\Invoice\DefaultCalculator;
use App\Model\InvoiceModel;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Invoice\DefaultCalculator
*/
class DefaultCalculatorTest extends TestCase
{
public function testEmptyModel()
{
$customer = new Customer();
$template = new InvoiceTemplate();
$model = new InvoiceModel();
$model->setCustomer($customer);
$model->setTemplate($template);
$sut = new DefaultCalculator();
$sut->setModel($model);
$this->assertEquals(0, $sut->getTotal());
$this->assertEquals(0, $sut->getVat());
$this->assertEquals('EUR', $sut->getCurrency());
$this->assertEquals(0, $sut->getSubtotal());
$this->assertEquals(0, $sut->getTimeWorked());
$this->assertEquals([], $sut->getEntries());
}
public function testWithMultipleEntries()
{
$customer = new Customer();
$template = new InvoiceTemplate();
$template->setVat(19);
$timesheet = new Timesheet();
$timesheet->setDuration(3600);
$timesheet->setRate(293.27);
$timesheet2 = new Timesheet();
$timesheet2->setDuration(400);
$timesheet2->setRate(84);
$timesheet3 = new Timesheet();
$timesheet3->setDuration(1800);
$timesheet3->setRate(111.11);
$entries = [$timesheet, $timesheet2, $timesheet3];
$model = new InvoiceModel();
$model->setCustomer($customer);
$model->setTemplate($template);
$model->setEntries($entries);
$sut = new DefaultCalculator();
$sut->setModel($model);
$this->assertEquals(581.17, $sut->getTotal());
$this->assertEquals(19, $sut->getVat());
$this->assertEquals('EUR', $sut->getCurrency());
$this->assertEquals(488.38, $sut->getSubtotal());
$this->assertEquals(5800, $sut->getTimeWorked());
$this->assertEquals($entries, $sut->getEntries());
}
}

View File

@@ -0,0 +1,124 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Tests\Invoice;
use App\Entity\Activity;
use App\Entity\Customer;
use App\Entity\InvoiceTemplate;
use App\Entity\Project;
use App\Entity\Timesheet;
use App\Invoice\ShortInvoiceCalculator;
use App\Model\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Invoice\ShortInvoiceCalculator
*/
class ShortInvoiceCalculatorTest extends TestCase
{
public function testEmptyModel()
{
$customer = new Customer();
$template = new InvoiceTemplate();
$query = new InvoiceQuery();
$model = new InvoiceModel();
$model->setCustomer($customer);
$model->setTemplate($template);
$model->setQuery($query);
$sut = new ShortInvoiceCalculator();
$sut->setModel($model);
$this->assertEquals(0, $sut->getTotal());
$this->assertEquals(0, $sut->getVat());
$this->assertEquals('EUR', $sut->getCurrency());
$this->assertEquals(0, $sut->getSubtotal());
$this->assertEquals(0, $sut->getTimeWorked());
$this->assertEquals(1, count($sut->getEntries()));
}
public function testWithMultipleEntries()
{
$customer = new Customer();
$template = new InvoiceTemplate();
$template->setVat(19);
$activity = new Activity();
$activity->setName('activity description');
$timesheet = new Timesheet();
$timesheet->setDuration(3600);
$timesheet->setRate(293.27);
$timesheet2 = new Timesheet();
$timesheet2->setDuration(400);
$timesheet2->setRate(84);
$timesheet3 = new Timesheet();
$timesheet3->setDuration(1800);
$timesheet3->setRate(111.11);
$entries = [$timesheet, $timesheet2, $timesheet3];
$query = new InvoiceQuery();
$query->setActivity($activity);
$model = new InvoiceModel();
$model->setCustomer($customer);
$model->setTemplate($template);
$model->setEntries($entries);
$model->setQuery($query);
$sut = new ShortInvoiceCalculator();
$sut->setModel($model);
$this->assertEquals(581.17, $sut->getTotal());
$this->assertEquals(19, $sut->getVat());
$this->assertEquals('EUR', $sut->getCurrency());
$this->assertEquals(488.38, $sut->getSubtotal());
$this->assertEquals(5800, $sut->getTimeWorked());
$this->assertEquals(1, count($sut->getEntries()));
/** @var Timesheet $result */
$result = $sut->getEntries()[0];
$this->assertEquals('activity description', $result->getDescription());
$this->assertEquals(488.38, $result->getRate());
$this->assertEquals(5800, $result->getDuration());
}
public function testDescriptionByProject()
{
$customer = new Customer();
$template = new InvoiceTemplate();
$template->setVat(19);
$project = new Project();
$project->setName('project description');
$query = new InvoiceQuery();
$query->setProject($project);
$model = new InvoiceModel();
$model->setCustomer($customer);
$model->setTemplate($template);
$model->setEntries([]);
$model->setQuery($query);
$sut = new ShortInvoiceCalculator();
$sut->setModel($model);
$this->assertEquals(1, count($sut->getEntries()));
/** @var Timesheet $result */
$result = $sut->getEntries()[0];
$this->assertEquals('project description', $result->getDescription());
}
}

View File

@@ -147,6 +147,63 @@ class DurationCalculatorTest extends TestCase
(clone $start)->setTime(14, 32, 52), // 14:33 => 2:18 (second duration will not be rounded)
8280
],
[
[
'default' => [
'days' => [$day],
'begin' => 0,
'end' => 0,
'duration' => 1,
],
'weekdays' => [
'days' => ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'],
'begin' => 0,
'end' => 0,
'duration' => 1,
],
],
(clone $start)->setTime(12, 27, 35), // no diff, to test ...
(clone $start)->setTime(12, 27, 35), // ... that no rounding is applied
0
],
[
[
'default' => [
'days' => [$day],
'begin' => 1,
'end' => 1,
'duration' => 1,
],
'weekdays' => [
'days' => ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'],
'begin' => 1,
'end' => 1,
'duration' => 1,
],
],
(clone $start)->setTime(12, 27, 00), // no diff, to test ...
(clone $start)->setTime(12, 27, 00), // ... that no rounding is applied
0
],
[
[
'default' => [
'days' => [$day],
'begin' => 0,
'end' => 0,
'duration' => 0,
],
'weekdays' => [
'days' => ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'],
'begin' => 0,
'end' => 0,
'duration' => 0,
],
],
(clone $start)->setTime(12, 27, 35), // no diff, to test ...
(clone $start)->setTime(12, 27, 35), // ... that no rounding is applied
0
],
];
}
}

View File

@@ -48,5 +48,4 @@ class MarkdownExtensionTest extends TestCase
$sut->timesheetContent("- test\n- foo\n\nfoo __bar__")
);
}
}