added user-specific rates (#1455)

This commit is contained in:
Kevin Papst
2020-02-10 20:29:43 +01:00
committed by GitHub
parent 465d7166d4
commit 52c7437076
83 changed files with 2054 additions and 520 deletions

View File

@@ -285,7 +285,7 @@ class ActivityControllerTest extends APIControllerBaseTest
protected function assertStructure(array $result, $full = true)
{
$expectedKeys = [
'id', 'name', 'visible', 'project', 'hourlyRate', 'fixedRate', 'color', 'metaFields', 'parentTitle'
'id', 'name', 'visible', 'project', 'color', 'metaFields', 'parentTitle'
];
if ($full) {

View File

@@ -230,7 +230,7 @@ class CustomerControllerTest extends APIControllerBaseTest
protected function assertStructure(array $result, $full = true)
{
$expectedKeys = [
'id', 'name', 'visible', 'hourlyRate', 'fixedRate', 'color', 'metaFields', 'teams'
'id', 'name', 'visible', 'color', 'metaFields', 'teams'
];
if ($full) {

View File

@@ -152,7 +152,7 @@ class ProjectControllerTest extends APIControllerBaseTest
$data = [
'name' => 'foo',
'customer' => 1,
'visible' => true
'visible' => true,
];
$this->request($client, '/api/projects', 'POST', [], json_encode($data));
$response = $client->getResponse();
@@ -283,7 +283,7 @@ class ProjectControllerTest extends APIControllerBaseTest
protected function assertStructure(array $result, $full = true)
{
$expectedKeys = [
'id', 'name', 'visible', 'customer', 'hourlyRate', 'fixedRate', 'color', 'metaFields', 'parentTitle', 'start', 'end', 'teams'
'id', 'name', 'visible', 'customer', 'color', 'metaFields', 'parentTitle', 'start', 'end', 'teams'
];
if ($full) {

View File

@@ -11,6 +11,7 @@ namespace App\Tests\Controller;
use App\Entity\Activity;
use App\Entity\ActivityMeta;
use App\Entity\Project;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Tests\DataFixtures\ActivityFixtures;
@@ -67,7 +68,7 @@ class ActivityControllerTest extends ControllerBaseTest
$this->assertDataTableRowCount($client, 'datatable_activity_admin', 5);
}
public function testBudgetAction()
public function testDetailsAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
/** @var EntityManager $em */
@@ -79,9 +80,70 @@ class ActivityControllerTest extends ControllerBaseTest
$fixture->setUser($this->getUserByRole($em, User::ROLE_ADMIN));
$this->importFixture($client, $fixture);
$project = $em->getRepository(Project::class)->find(1);
$fixture = new ActivityFixtures();
$fixture->setAmount(6); // to trigger a second page
$fixture->setProjects([$project]);
$this->importFixture($client, $fixture);
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$this->assertAccessIsGranted($client, '/admin/activity/1/budget');
$this->assertAccessIsGranted($client, '/admin/activity/1/details');
self::assertHasProgressbar($client);
$node = $client->getCrawler()->filter('div.box#activity_details_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#budget_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#activity_rates_box');
self::assertEquals(1, $node->count());
}
public function testAddRateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$this->assertAccessIsGranted($client, '/admin/activity/1/rate');
$form = $client->getCrawler()->filter('form[name=activity_rate_form]')->form();
$client->submit($form, [
'activity_rate_form' => [
'user' => null,
'rate' => 123.45,
]
]);
$this->assertIsRedirect($client, $this->createUrl('/admin/activity/1/details'));
$client->followRedirect();
$node = $client->getCrawler()->filter('div.box#activity_rates_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(1, $node->count());
self::assertStringContainsString('123.45', $node->text(null, true));
}
public function testDeleteRateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$this->assertAccessIsGranted($client, '/admin/activity/1/rate');
$form = $client->getCrawler()->filter('form[name=activity_rate_form]')->form();
$client->submit($form, [
'activity_rate_form' => [
'user' => null,
'rate' => 123.45,
]
]);
$this->assertIsRedirect($client, $this->createUrl('/admin/activity/1/details'));
$client->followRedirect();
$node = $client->getCrawler()->filter('div.box#activity_rates_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(1, $node->count());
self::assertStringContainsString('123.45', $node->text(null, true));
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr td.actions a');
self::assertEquals(1, $node->count());
$url = $node->attr('href');
$client->request('GET', $url);
$this->assertIsRedirect($client, $this->createUrl('/admin/activity/1/details'));
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(0, $node->count());
}
public function testCreateAction()

View File

@@ -87,6 +87,56 @@ class CustomerControllerTest extends ControllerBaseTest
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#team_listing_box a.btn-box-tool');
self::assertEquals(2, $node->count());
$node = $client->getCrawler()->filter('div.box#customer_rates_box');
self::assertEquals(1, $node->count());
}
public function testAddRateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$this->assertAccessIsGranted($client, '/admin/customer/1/rate');
$form = $client->getCrawler()->filter('form[name=customer_rate_form]')->form();
$client->submit($form, [
'customer_rate_form' => [
'user' => null,
'rate' => 123.45,
]
]);
$this->assertIsRedirect($client, $this->createUrl('/admin/customer/1/details'));
$client->followRedirect();
$node = $client->getCrawler()->filter('div.box#customer_rates_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(1, $node->count());
self::assertStringContainsString('123.45', $node->text(null, true));
}
public function testDeleteRateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$this->assertAccessIsGranted($client, '/admin/customer/1/rate');
$form = $client->getCrawler()->filter('form[name=customer_rate_form]')->form();
$client->submit($form, [
'customer_rate_form' => [
'user' => null,
'rate' => 123.45,
]
]);
$this->assertIsRedirect($client, $this->createUrl('/admin/customer/1/details'));
$client->followRedirect();
$node = $client->getCrawler()->filter('div.box#customer_rates_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(1, $node->count());
self::assertStringContainsString('123.45', $node->text(null, true));
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr td.actions a');
self::assertEquals(1, $node->count());
$url = $node->attr('href');
$client->request('GET', $url);
$this->assertIsRedirect($client, $this->createUrl('/admin/customer/1/details'));
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(0, $node->count());
}
public function testAddCommentAction()

View File

@@ -106,6 +106,56 @@ class ProjectControllerTest extends ControllerBaseTest
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#team_listing_box a.btn-box-tool');
self::assertEquals(2, $node->count());
$node = $client->getCrawler()->filter('div.box#project_rates_box');
self::assertEquals(1, $node->count());
}
public function testAddRateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$this->assertAccessIsGranted($client, '/admin/project/1/rate');
$form = $client->getCrawler()->filter('form[name=project_rate_form]')->form();
$client->submit($form, [
'project_rate_form' => [
'user' => null,
'rate' => 123.45,
]
]);
$this->assertIsRedirect($client, $this->createUrl('/admin/project/1/details'));
$client->followRedirect();
$node = $client->getCrawler()->filter('div.box#project_rates_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(1, $node->count());
self::assertStringContainsString('123.45', $node->text(null, true));
}
public function testDeleteRateAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$this->assertAccessIsGranted($client, '/admin/project/1/rate');
$form = $client->getCrawler()->filter('form[name=project_rate_form]')->form();
$client->submit($form, [
'project_rate_form' => [
'user' => null,
'rate' => 123.45,
]
]);
$this->assertIsRedirect($client, $this->createUrl('/admin/project/1/details'));
$client->followRedirect();
$node = $client->getCrawler()->filter('div.box#project_rates_box');
self::assertEquals(1, $node->count());
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(1, $node->count());
self::assertStringContainsString('123.45', $node->text(null, true));
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr td.actions a');
self::assertEquals(1, $node->count());
$url = $node->attr('href');
$client->request('GET', $url);
$this->assertIsRedirect($client, $this->createUrl('/admin/project/1/details'));
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr:not(.summary)');
self::assertEquals(0, $node->count());
}
public function testAddCommentAction()

View File

@@ -33,7 +33,7 @@ class SystemConfigurationControllerTest extends ControllerBaseTest
$result = $client->getCrawler()->filter('section.content div.box.box-primary');
$this->assertEquals(count($expectedForms), count($result));
$result = $client->getCrawler()->filter('section.content form div.box.box-primary');
$result = $client->getCrawler()->filter('section.content div.box.box-primary form');
$this->assertEquals(count($expectedForms), count($result));
foreach ($expectedForms as $formConfig) {

View File

@@ -0,0 +1,55 @@
<?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\Entity;
use App\Entity\Activity;
use App\Entity\ActivityRate;
use App\Entity\User;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Entity\ActivityRate
* @covers \App\Entity\Rate
*/
class ActivityRateTest extends TestCase
{
public function testDefaultValues()
{
$sut = new ActivityRate();
self::assertNull($sut->getId());
self::assertEquals(0.00, $sut->getRate());
self::assertNull($sut->getActivity());
self::assertNull($sut->getUser());
self::assertEquals(5, $sut->getScore());
self::assertFalse($sut->isFixed());
}
public function testSetterAndGetter()
{
$sut = new ActivityRate();
self::assertInstanceOf(ActivityRate::class, $sut->setIsFixed(true));
self::assertTrue($sut->isFixed());
self::assertInstanceOf(ActivityRate::class, $sut->setRate(12.34));
self::assertEquals(12.34, $sut->getRate());
$user = new User();
$user->setAlias('foo');
$user->setUsername('bar');
self::assertInstanceOf(ActivityRate::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
$entity = new Activity();
$entity->setName('foo');
self::assertInstanceOf(ActivityRate::class, $sut->setActivity($entity));
self::assertSame($entity, $sut->getActivity());
}
}

View File

@@ -11,6 +11,7 @@ namespace App\Tests\Entity;
use App\Entity\Activity;
use App\Entity\ActivityMeta;
use App\Entity\Project;
use Doctrine\Common\Collections\Collection;
use PHPUnit\Framework\TestCase;
@@ -27,8 +28,7 @@ class ActivityTest extends TestCase
$this->assertNull($sut->getName());
$this->assertNull($sut->getComment());
$this->assertTrue($sut->getVisible());
$this->assertNull($sut->getFixedRate());
$this->assertNull($sut->getHourlyRate());
$this->assertTrue($sut->isGlobal());
$this->assertNull($sut->getColor());
$this->assertEquals(0.0, $sut->getBudget());
$this->assertEquals(0, $sut->getTimeBudget());
@@ -53,17 +53,15 @@ class ActivityTest extends TestCase
$this->assertInstanceOf(Activity::class, $sut->setColor('#fffccc'));
$this->assertEquals('#fffccc', $sut->getColor());
$this->assertInstanceOf(Activity::class, $sut->setFixedRate(13.47));
$this->assertEquals(13.47, $sut->getFixedRate());
$this->assertInstanceOf(Activity::class, $sut->setHourlyRate(99));
$this->assertEquals(99, $sut->getHourlyRate());
$this->assertInstanceOf(Activity::class, $sut->setBudget(12345.67));
$this->assertEquals(12345.67, $sut->getBudget());
$this->assertInstanceOf(Activity::class, $sut->setTimeBudget(937321));
$this->assertEquals(937321, $sut->getTimeBudget());
$this->assertTrue($sut->isGlobal());
$this->assertInstanceOf(Activity::class, $sut->setProject(new Project()));
$this->assertFalse($sut->isGlobal());
}
public function testMetaFields()

View File

@@ -0,0 +1,55 @@
<?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\Entity;
use App\Entity\Customer;
use App\Entity\CustomerRate;
use App\Entity\User;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Entity\CustomerRate
* @covers \App\Entity\Rate
*/
class CustomerRateTest extends TestCase
{
public function testDefaultValues()
{
$sut = new CustomerRate();
self::assertNull($sut->getId());
self::assertEquals(0.00, $sut->getRate());
self::assertNull($sut->getCustomer());
self::assertNull($sut->getUser());
self::assertEquals(1, $sut->getScore());
self::assertFalse($sut->isFixed());
}
public function testSetterAndGetter()
{
$sut = new CustomerRate();
self::assertInstanceOf(CustomerRate::class, $sut->setIsFixed(true));
self::assertTrue($sut->isFixed());
self::assertInstanceOf(CustomerRate::class, $sut->setRate(12.34));
self::assertEquals(12.34, $sut->getRate());
$user = new User();
$user->setAlias('foo');
$user->setUsername('bar');
self::assertInstanceOf(CustomerRate::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
$entity = new Customer();
$entity->setName('foo');
self::assertInstanceOf(CustomerRate::class, $sut->setCustomer($entity));
self::assertSame($entity, $sut->getCustomer());
}
}

View File

@@ -43,8 +43,6 @@ class CustomerTest extends TestCase
self::assertNull($sut->getHomepage());
self::assertNull($sut->getTimezone());
self::assertNull($sut->getFixedRate());
self::assertNull($sut->getHourlyRate());
self::assertNull($sut->getColor());
self::assertEquals(0.0, $sut->getBudget());
self::assertEquals(0, $sut->getTimeBudget());
@@ -92,12 +90,6 @@ class CustomerTest extends TestCase
self::assertInstanceOf(Customer::class, $sut->setHomepage('https://www.example.com'));
self::assertEquals('https://www.example.com', $sut->getHomepage());
self::assertInstanceOf(Customer::class, $sut->setFixedRate(13.47));
self::assertEquals(13.47, $sut->getFixedRate());
self::assertInstanceOf(Customer::class, $sut->setHourlyRate(99));
self::assertEquals(99, $sut->getHourlyRate());
self::assertInstanceOf(Customer::class, $sut->setBudget(12345.67));
self::assertEquals(12345.67, $sut->getBudget());

View File

@@ -0,0 +1,55 @@
<?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\Entity;
use App\Entity\Project;
use App\Entity\ProjectRate;
use App\Entity\User;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Entity\ProjectRate
* @covers \App\Entity\Rate
*/
class ProjectRateTest extends TestCase
{
public function testDefaultValues()
{
$sut = new ProjectRate();
self::assertNull($sut->getId());
self::assertEquals(0.00, $sut->getRate());
self::assertNull($sut->getProject());
self::assertNull($sut->getUser());
self::assertEquals(3, $sut->getScore());
self::assertFalse($sut->isFixed());
}
public function testSetterAndGetter()
{
$sut = new ProjectRate();
self::assertInstanceOf(ProjectRate::class, $sut->setIsFixed(true));
self::assertTrue($sut->isFixed());
self::assertInstanceOf(ProjectRate::class, $sut->setRate(12.34));
self::assertEquals(12.34, $sut->getRate());
$user = new User();
$user->setAlias('foo');
$user->setUsername('bar');
self::assertInstanceOf(ProjectRate::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
$entity = new Project();
$entity->setName('foo');
self::assertInstanceOf(ProjectRate::class, $sut->setProject($entity));
self::assertSame($entity, $sut->getProject());
}
}

View File

@@ -34,8 +34,6 @@ class ProjectTest extends TestCase
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());
@@ -85,12 +83,6 @@ class ProjectTest extends TestCase
self::assertInstanceOf(Project::class, $sut->setVisible(false));
self::assertFalse($sut->getVisible());
self::assertInstanceOf(Project::class, $sut->setFixedRate(13.47));
self::assertEquals(13.47, $sut->getFixedRate());
self::assertInstanceOf(Project::class, $sut->setHourlyRate(99));
self::assertEquals(99, $sut->getHourlyRate());
self::assertInstanceOf(Project::class, $sut->setBudget(12345.67));
self::assertEquals(12345.67, $sut->getBudget());

View File

@@ -40,12 +40,6 @@ class InvoiceModelActivityHydratorTest extends TestCase
'activity.id',
'activity.name',
'activity.comment',
'activity.fixed_rate',
'activity.fixed_rate_nc',
'activity.fixed_rate_plain',
'activity.hourly_rate',
'activity.hourly_rate_nc',
'activity.hourly_rate_plain',
'activity.meta.foo-activity',
];

View File

@@ -47,12 +47,6 @@ class InvoiceModelCustomerHydratorTest extends TestCase
'customer.number',
'customer.homepage',
'customer.comment',
'customer.fixed_rate',
'customer.fixed_rate_nc',
'customer.fixed_rate_plain',
'customer.hourly_rate',
'customer.hourly_rate_nc',
'customer.hourly_rate_plain',
'customer.meta.foo-customer',
];

View File

@@ -42,12 +42,6 @@ class InvoiceModelProjectHydratorTest extends TestCase
'project.comment',
'project.order_date',
'project.order_number',
'project.fixed_rate',
'project.fixed_rate_nc',
'project.fixed_rate_plain',
'project.hourly_rate',
'project.hourly_rate_nc',
'project.hourly_rate_plain',
'project.meta.foo-project',
'project.start_date',
'project.end_date',

View File

@@ -119,22 +119,10 @@ class DebugRendererTest extends TestCase
'customer.number',
'customer.homepage',
'customer.comment',
'customer.fixed_rate',
'customer.fixed_rate_nc',
'customer.fixed_rate_plain',
'customer.hourly_rate',
'customer.hourly_rate_nc',
'customer.hourly_rate_plain',
'customer.meta.foo-customer',
'activity.id',
'activity.name',
'activity.comment',
'activity.fixed_rate',
'activity.fixed_rate_nc',
'activity.fixed_rate_plain',
'activity.hourly_rate',
'activity.hourly_rate_nc',
'activity.hourly_rate_plain',
'activity.meta.foo-activity',
'user.alias',
'user.email',
@@ -152,12 +140,6 @@ class DebugRendererTest extends TestCase
'project.comment',
'project.order_date',
'project.order_number',
'project.fixed_rate',
'project.fixed_rate_nc',
'project.fixed_rate_plain',
'project.hourly_rate',
'project.hourly_rate_nc',
'project.hourly_rate_plain',
'project.meta.foo-project',
'project.start_date',
'project.end_date',

View File

@@ -10,11 +10,15 @@
namespace App\Tests\Timesheet\Calculator;
use App\Entity\Activity;
use App\Entity\ActivityRate;
use App\Entity\Customer;
use App\Entity\CustomerRate;
use App\Entity\Project;
use App\Entity\ProjectRate;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Entity\UserPreference;
use App\Repository\TimesheetRepository;
use App\Timesheet\Calculator\RateCalculator;
use PHPUnit\Framework\TestCase;
@@ -23,6 +27,16 @@ use PHPUnit\Framework\TestCase;
*/
class RateCalculatorTest extends TestCase
{
protected function getRateRepositoryMock(array $rates = [])
{
$mock = $this->getMockBuilder(TimesheetRepository::class)->disableOriginalConstructor()->getMock();
if (!empty($rates)) {
$mock->expects($this->any())->method('findMatchingRates')->willReturn($rates);
}
return $mock;
}
public function testCalculateWithTimesheetHourlyRate()
{
$record = new Timesheet();
@@ -31,7 +45,7 @@ class RateCalculatorTest extends TestCase
$record->setHourlyRate(100);
$record->setActivity(new Activity());
$sut = new RateCalculator([]);
$sut = new RateCalculator([], $this->getRateRepositoryMock());
$sut->calculate($record);
$this->assertEquals(50, $record->getRate());
}
@@ -46,34 +60,34 @@ class RateCalculatorTest extends TestCase
$record->setHourlyRate(99);
$record->setActivity(new Activity());
$sut = new RateCalculator([]);
$sut = new RateCalculator([], $this->getRateRepositoryMock());
$sut->calculate($record);
$this->assertEquals(10, $record->getRate());
}
public function getRateTestData()
{
yield 'a0' => [0.0, 0, 0, null, null, null, null, null, null, null, null];
yield 'a1' => [0.0, 1800, 0, null, null, null, null, null, null, null, null];
yield 'a2' => [0.5, 1800, 1, null, null, null, null, null, null, null, null];
yield 'a3' => [0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
yield 'b1' => [1.5, 1800, 1, 3, null, 5, null, 7, null, 9, null];
yield 'b2' => [2.5, 1800, 1, null, null, 5, null, 7, null, 9, null];
yield 'b3' => [3.5, 1800, 1, null, null, null, null, 7, null, 9, null];
yield 'b4' => [4.5, 1800, 1, null, null, null, null, null, null, 9, null];
yield 'b5' => [2.0, 1800, 1, null, 2, null, 3, null, 4, null, 5];
yield 'b6' => [3.0, 1800, 1, null, null, null, 3, null, 4, null, 5];
yield 'b7' => [4.0, 1800, 1, null, null, null, null, null, 4, null, 5];
yield 'b8' => [3.0, 1800, 1, null, null, null, 3, null, null, null, 5];
yield 'b9' => [2.0, 1800, 1, null, 2, null, null, null, null, null, 5];
yield 'c0' => [5.0, 1800, 100, 10, null, null, null, null, null, null, null];
yield 'd0' => [10, 1800, 100, null, 10, null, null, null, null, null, null];
yield 'e0' => [10, 1800, 100, null, null, 20, null, null, null, null, null];
yield 'f0' => [20, 1800, 100, null, null, null, 20, null, null, null, null];
yield 'g0' => [15, 1800, 100, null, null, null, null, 30, null, null, null];
yield 'h0' => [30, 1800, 100, null, null, null, null, null, 30, null, null];
yield 'i0' => [20, 1800, 100, null, null, null, null, null, null, 40, null];
yield 'j0' => [40, 1800, 100, null, null, null, null, null, null, null, 40];
yield 'a0' => [0.0, 0, 0, null, null, null, null, null, null, null, null];
yield 'a1' => [0.0, 1800, 0, null, null, null, null, null, null, null, null];
yield 'a2' => [0.5, 1800, 1, null, null, null, null, null, null, null, null];
yield 'a3' => [0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
yield 'b1' => [1.5, 1800, 1, 3, null, 5, null, 7, null, 9, null];
yield 'b2' => [2.5, 1800, 1, null, null, 5, null, 7, null, 9, null];
yield 'b3' => [3.5, 1800, 1, null, null, null, null, 7, null, 9, null];
yield 'b4' => [4.5, 1800, 1, null, null, null, null, null, null, 9, null];
yield 'b5' => [2.0, 1800, 1, null, 2, null, 3, null, 4, null, 5];
yield 'b6' => [3.0, 1800, 1, null, null, null, 3, null, 4, null, 5];
yield 'b7' => [4.0, 1800, 1, null, null, null, null, null, 4, null, 5];
yield 'b8' => [3.0, 1800, 1, null, null, null, 3, null, null, null, 5];
yield 'b9' => [2.0, 1800, 1, null, 2, null, null, null, null, null, 5];
yield 'c0' => [5.0, 1800, 100, 10, null, null, null, null, null, null, null];
yield 'd0' => [10, 1800, 100, null, 10, null, null, null, null, null, null];
yield 'e0' => [10, 1800, 100, null, null, 20, null, null, null, null, null];
yield 'f0' => [20, 1800, 100, null, null, null, 20, null, null, null, null];
yield 'g0' => [15, 1800, 100, null, null, null, null, 30, null, null, null];
yield 'h0' => [30, 1800, 100, null, null, null, null, null, 30, null, null];
yield 'i0' => [20, 1800, 100, null, null, null, null, null, null, 40, null];
yield 'j0' => [40, 1800, 100, null, null, null, null, null, null, null, 40];
}
/**
@@ -93,24 +107,12 @@ class RateCalculatorTest extends TestCase
$customerFixed
) {
$customer = new Customer();
$customer
->setHourlyRate($customerHourly)
->setFixedRate($customerFixed)
;
$project = new Project();
$project
->setHourlyRate($projectHourly)
->setFixedRate($projectFixed)
->setCustomer($customer)
;
$project->setCustomer($customer);
$activity = new Activity();
$activity
->setHourlyRate($activityHourly)
->setFixedRate($activityFixed)
->setProject($project)
;
$activity->setProject($project);
$timesheet = new Timesheet();
$timesheet
@@ -123,7 +125,27 @@ class RateCalculatorTest extends TestCase
->setUser($this->getTestUser($userRate))
;
$sut = new RateCalculator([]);
$rates = [];
if (null !== $customerFixed) {
$rates[] = (new CustomerRate())->setRate($customerFixed)->setIsFixed(true);
} elseif (null !== $customerHourly) {
$rates[] = (new CustomerRate())->setRate($customerHourly);
}
if (null !== $projectFixed) {
$rates[] = (new ProjectRate())->setRate($projectFixed)->setIsFixed(true);
} elseif (null !== $projectHourly) {
$rates[] = (new ProjectRate())->setRate($projectHourly);
}
if (null !== $activityFixed) {
$rates[] = (new ActivityRate())->setRate($activityFixed)->setIsFixed(true);
} elseif (null !== $activityHourly) {
$rates[] = (new ActivityRate())->setRate($activityHourly);
}
$sut = new RateCalculator([], $this->getRateRepositoryMock($rates));
$sut->calculate($timesheet);
$this->assertEquals($exptectedRate, $timesheet->getRate());
}
@@ -151,7 +173,7 @@ class RateCalculatorTest extends TestCase
$this->assertEquals(0, $record->getRate());
$sut = new RateCalculator([]);
$sut = new RateCalculator([], $this->getRateRepositoryMock());
$sut->calculate($record);
$this->assertEquals(0, $record->getRate());
}
@@ -177,7 +199,7 @@ class RateCalculatorTest extends TestCase
$record->setEnd($end);
$sut = new RateCalculator($rules);
$sut = new RateCalculator($rules, $this->getRateRepositoryMock());
$sut->calculate($record);
$this->assertEquals($expectedRate, $record->getRate());