added freelancer invoice template (#254)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
79
tests/Invoice/DefaultCalculatorTest.php
Normal file
79
tests/Invoice/DefaultCalculatorTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
124
tests/Invoice/ShortInvoiceCalculatorTest.php
Normal file
124
tests/Invoice/ShortInvoiceCalculatorTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,5 +48,4 @@ class MarkdownExtensionTest extends TestCase
|
||||
$sut->timesheetContent("- test\n- foo\n\nfoo __bar__")
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user