new invoice template variables for budgets (#3005)

This commit is contained in:
Kevin Papst
2021-12-08 22:15:07 +01:00
committed by GitHub
parent 82525f382d
commit 22ce6b047a
31 changed files with 389 additions and 188 deletions

View File

@@ -16,9 +16,9 @@ use App\Entity\Project;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Invoice\CalculatorInterface;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use PHPUnit\Framework\TestCase;
abstract class AbstractCalculatorTest extends TestCase
@@ -44,7 +44,7 @@ abstract class AbstractCalculatorTest extends TestCase
$template = new InvoiceTemplate();
$query = new InvoiceQuery();
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->setQuery($query);
@@ -88,7 +88,7 @@ abstract class AbstractCalculatorTest extends TestCase
->setActivity($activity)
->setProject($project);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries([$timesheet]);

View File

@@ -16,9 +16,9 @@ use App\Entity\Project;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Invoice\Calculator\ActivityInvoiceCalculator;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
/**
* @covers \App\Invoice\Calculator\ActivityInvoiceCalculator
@@ -134,7 +134,7 @@ class ActivityInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setActivity($activity1);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -16,9 +16,9 @@ use App\Entity\Project;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Invoice\Calculator\DateInvoiceCalculator;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use DateTime;
/**
@@ -107,7 +107,7 @@ class DateInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setProjects([$project1]);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -15,9 +15,9 @@ use App\Entity\InvoiceTemplate;
use App\Entity\Tag;
use App\Entity\Timesheet;
use App\Invoice\Calculator\DefaultCalculator;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
/**
* @covers \App\Invoice\Calculator\DefaultCalculator
@@ -63,7 +63,7 @@ class DefaultCalculatorTest extends AbstractCalculatorTest
$entries = [$timesheet, $timesheet2, $timesheet3];
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -16,9 +16,9 @@ use App\Entity\Project;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Invoice\Calculator\ProjectInvoiceCalculator;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use DateTime;
/**
@@ -107,7 +107,7 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setProjects([$project1]);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -18,9 +18,9 @@ use App\Entity\Timesheet;
use App\Entity\User;
use App\Invoice\Calculator\ShortInvoiceCalculator;
use App\Invoice\InvoiceItem;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
/**
* @covers \App\Invoice\Calculator\ShortInvoiceCalculator
@@ -91,7 +91,7 @@ class ShortInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setActivity($activity);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);
@@ -173,7 +173,7 @@ class ShortInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setActivity($activity);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);
@@ -252,7 +252,7 @@ class ShortInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setActivity($activity);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -16,9 +16,9 @@ use App\Entity\Project;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Invoice\Calculator\UserInvoiceCalculator;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
/**
* @covers \App\Invoice\Calculator\UserInvoiceCalculator
@@ -105,7 +105,7 @@ class UserInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setActivity($activity);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -16,9 +16,9 @@ use App\Entity\Project;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Invoice\Calculator\WeeklyInvoiceCalculator;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use DateTime;
/**
@@ -110,7 +110,7 @@ class WeeklyInvoiceCalculatorTest extends AbstractCalculatorTest
$query = new InvoiceQuery();
$query->setProjects([$project1]);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -9,6 +9,7 @@
namespace App\Tests\Invoice\Hydrator;
use App\Activity\ActivityStatisticService;
use App\Invoice\Hydrator\InvoiceModelActivityHydrator;
use App\Tests\Invoice\Renderer\RendererTestTrait;
use PHPUnit\Framework\TestCase;
@@ -24,7 +25,7 @@ class InvoiceModelActivityHydratorTest extends TestCase
{
$model = $this->getInvoiceModel();
$sut = new InvoiceModelActivityHydrator();
$sut = new InvoiceModelActivityHydrator($this->createMock(ActivityStatisticService::class));
$result = $sut->hydrate($model);
$this->assertModelStructure($result);
@@ -41,10 +42,18 @@ class InvoiceModelActivityHydratorTest extends TestCase
'activity.name',
'activity.comment',
'activity.meta.foo-activity',
'activity.budget_open',
'activity.budget_open_plain',
'activity.time_budget_open',
'activity.time_budget_open_plain',
'activity.1.id',
'activity.1.name',
'activity.1.comment',
'activity.1.meta.foo-activity',
'activity.1.budget_open',
'activity.1.budget_open_plain',
'activity.1.time_budget_open',
'activity.1.time_budget_open_plain',
];
$givenKeys = array_keys($model);

View File

@@ -9,6 +9,7 @@
namespace App\Tests\Invoice\Hydrator;
use App\Customer\CustomerStatisticService;
use App\Invoice\Hydrator\InvoiceModelCustomerHydrator;
use App\Tests\Invoice\Renderer\RendererTestTrait;
use PHPUnit\Framework\TestCase;
@@ -24,7 +25,7 @@ class InvoiceModelCustomerHydratorTest extends TestCase
{
$model = $this->getInvoiceModel();
$sut = new InvoiceModelCustomerHydrator();
$sut = new InvoiceModelCustomerHydrator($this->createMock(CustomerStatisticService::class));
$result = $sut->hydrate($model);
$this->assertModelStructure($result);
@@ -52,6 +53,10 @@ class InvoiceModelCustomerHydratorTest extends TestCase
'customer.phone',
'customer.mobile',
'customer.meta.foo-customer',
'customer.budget_open',
'customer.budget_open_plain',
'customer.time_budget_open',
'customer.time_budget_open_plain',
];
$givenKeys = array_keys($model);

View File

@@ -10,6 +10,7 @@
namespace App\Tests\Invoice\Hydrator;
use App\Invoice\Hydrator\InvoiceModelProjectHydrator;
use App\Project\ProjectStatisticService;
use App\Tests\Invoice\Renderer\RendererTestTrait;
use PHPUnit\Framework\TestCase;
@@ -24,7 +25,7 @@ class InvoiceModelProjectHydratorTest extends TestCase
{
$model = $this->getInvoiceModel();
$sut = new InvoiceModelProjectHydrator();
$sut = new InvoiceModelProjectHydrator($this->createMock(ProjectStatisticService::class));
$result = $sut->hydrate($model);
$this->assertModelStructure($result);
@@ -51,6 +52,10 @@ class InvoiceModelProjectHydratorTest extends TestCase
'project.budget_time',
'project.budget_time_decimal',
'project.budget_time_minutes',
'project.budget_open',
'project.budget_open_plain',
'project.time_budget_open',
'project.time_budget_open_plain',
'project.1.id',
'project.1.name',
'project.1.comment',
@@ -65,6 +70,10 @@ class InvoiceModelProjectHydratorTest extends TestCase
'project.1.budget_time',
'project.1.budget_time_decimal',
'project.1.budget_time_minutes',
'project.1.budget_open',
'project.1.budget_open_plain',
'project.1.time_budget_open',
'project.1.time_budget_open_plain',
];
$givenKeys = array_keys($model);

View File

@@ -13,10 +13,10 @@ use App\Entity\Customer;
use App\Entity\InvoiceTemplate;
use App\Entity\Project;
use App\Invoice\InvoiceFilename;
use App\Invoice\InvoiceModel;
use App\Invoice\NumberGenerator\DateNumberGenerator;
use App\Repository\InvoiceRepository;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use PHPUnit\Framework\TestCase;
/**
@@ -29,7 +29,7 @@ class InvoiceFilenameTest extends TestCase
$customer = new Customer();
$template = new InvoiceTemplate();
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setNumberGenerator($this->getNumberGeneratorSut());
$model->setTemplate($template);
$model->setCustomer($customer);

View File

@@ -16,6 +16,7 @@ use App\Invoice\Calculator\DefaultCalculator;
use App\Invoice\InvoiceModel;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\NumberGenerator\IncrementingNumberGenerator;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use PHPUnit\Framework\TestCase;
/**
@@ -26,7 +27,7 @@ class InvoiceModelTest extends TestCase
public function testEmptyObject()
{
$formatter = new DebugFormatter();
$sut = new InvoiceModel($formatter);
$sut = (new InvoiceModelFactoryFactory($this))->create()->createModel($formatter);
self::assertNull($sut->getQuery());
self::assertNull($sut->getCustomer());
@@ -51,7 +52,7 @@ class InvoiceModelTest extends TestCase
public function testEmptyObjectThrowsExceptionOnNumberGenerator()
{
$formatter = new DebugFormatter();
$sut = new InvoiceModel($formatter);
$sut = (new InvoiceModelFactoryFactory($this))->create()->createModel($formatter);
$this->expectException(\Exception::class);
$this->expectExceptionMessage('InvoiceModel::getInvoiceNumber() cannot be called before calling setNumberGenerator()');
@@ -60,7 +61,7 @@ class InvoiceModelTest extends TestCase
public function testSetter()
{
$sut = new InvoiceModel(new DebugFormatter());
$sut = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$query = new InvoiceQuery();
self::assertInstanceOf(InvoiceModel::class, $sut->setQuery($query));
@@ -95,7 +96,7 @@ class InvoiceModelTest extends TestCase
*/
public function testDeprecations()
{
$sut = new InvoiceModel(new DebugFormatter());
$sut = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$entries = [new Timesheet()];
self::assertInstanceOf(InvoiceModel::class, $sut->setEntries($entries));

View File

@@ -12,10 +12,10 @@ namespace App\Tests\Invoice\NumberGenerator;
use App\Configuration\SystemConfiguration;
use App\Entity\Customer;
use App\Entity\User;
use App\Invoice\InvoiceModel;
use App\Invoice\NumberGenerator\ConfigurableNumberGenerator;
use App\Repository\InvoiceRepository;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use PHPUnit\Framework\TestCase;
/**
@@ -156,7 +156,7 @@ class ConfigurableNumberGeneratorTest extends TestCase
$user->method('getAccountNumber')->willReturn('0815');
$sut = $this->getSut($format, $counter);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setInvoiceDate($invoiceDate);
$model->setCustomer($customer);
$model->setUser($user);
@@ -197,7 +197,7 @@ class ConfigurableNumberGeneratorTest extends TestCase
$this->expectExceptionMessage(sprintf('Unknown %s found', $brokenPart));
$sut = $this->getSut($format);
$model = new InvoiceModel(new DebugFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter());
$model->setInvoiceDate($invoiceDate);
$model->setCustomer(new Customer());
$sut->setModel($model);

View File

@@ -9,10 +9,10 @@
namespace App\Tests\Invoice\NumberGenerator;
use App\Invoice\InvoiceModel;
use App\Invoice\NumberGenerator\DateNumberGenerator;
use App\Repository\InvoiceRepository;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use PHPUnit\Framework\TestCase;
/**
@@ -40,7 +40,7 @@ class DateNumberGeneratorTest extends TestCase
public function testGetInvoiceNumber()
{
$sut = $this->getSut(false, false);
$sut->setModel(new InvoiceModel(new DebugFormatter()));
$sut->setModel((new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter()));
$this->assertEquals(date('ymd'), $sut->getInvoiceNumber());
$this->assertEquals('date', $sut->getId());
@@ -49,7 +49,7 @@ class DateNumberGeneratorTest extends TestCase
public function testGetInvoiceNumberWithExisting()
{
$sut = $this->getSut(true, false);
$sut->setModel(new InvoiceModel(new DebugFormatter()));
$sut->setModel((new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter()));
$this->assertEquals(date('ymd-01'), $sut->getInvoiceNumber());
$this->assertEquals('date', $sut->getId());
@@ -58,7 +58,7 @@ class DateNumberGeneratorTest extends TestCase
public function testGetInvoiceNumberWithManyExisting()
{
$sut = $this->getSut(true, true);
$sut->setModel(new InvoiceModel(new DebugFormatter()));
$sut->setModel((new InvoiceModelFactoryFactory($this))->create()->createModel(new DebugFormatter()));
$this->assertEquals(date('ymd-99'), $sut->getInvoiceNumber());
$this->assertEquals('date', $sut->getId());

View File

@@ -131,12 +131,20 @@ class DebugRendererTest extends TestCase
'customer.email',
'customer.fax',
'customer.phone',
'customer.budget_open',
'customer.budget_open_plain',
'customer.time_budget_open',
'customer.time_budget_open_plain',
'customer.mobile',
'customer.meta.foo-customer',
'activity.id',
'activity.name',
'activity.comment',
'activity.meta.foo-activity',
'activity.budget_open',
'activity.budget_open_plain',
'activity.time_budget_open',
'activity.time_budget_open_plain',
'user.alias',
'user.email',
'user.name',
@@ -146,8 +154,18 @@ class DebugRendererTest extends TestCase
'testFromModelHydrator',
];
if ($activityCounter === 1) {
$keys = array_merge($keys, [
'activity',
]);
}
if ($activityCounter > 1) {
$keys = array_merge($keys, [
'activity.1.budget_open',
'activity.1.budget_open_plain',
'activity.1.time_budget_open',
'activity.1.time_budget_open_plain',
'activity.1.id',
'activity.1.name',
'activity.1.comment',
@@ -171,7 +189,16 @@ class DebugRendererTest extends TestCase
'project.budget_time',
'project.budget_time_decimal',
'project.budget_time_minutes',
'project.budget_open',
'project.budget_open_plain',
'project.time_budget_open',
'project.time_budget_open_plain',
]);
if ($projectCounter === 1) {
$keys = array_merge($keys, [
'project',
]);
}
if ($projectCounter > 1) {
$keys = array_merge($keys, [
'project.1.id',
@@ -188,6 +215,10 @@ class DebugRendererTest extends TestCase
'project.1.budget_time',
'project.1.budget_time_decimal',
'project.1.budget_time_minutes',
'project.1.budget_open',
'project.1.budget_open_plain',
'project.1.time_budget_open',
'project.1.time_budget_open_plain',
]);
}
}

View File

@@ -30,6 +30,7 @@ use App\Invoice\NumberGenerator\DateNumberGenerator;
use App\Invoice\Renderer\AbstractRenderer;
use App\Repository\InvoiceRepository;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
trait RendererTestTrait
{
@@ -217,7 +218,7 @@ trait RendererTestTrait
$query->setEnd(new \DateTime());
$query->setProjects([$project, $project2]);
$model = new InvoiceModel($this->getFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel($this->getFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);
@@ -301,7 +302,7 @@ trait RendererTestTrait
$query->setBegin(new \DateTime());
$query->setEnd(new \DateTime());
$model = new InvoiceModel($this->getFormatter());
$model = (new InvoiceModelFactoryFactory($this))->create()->createModel($this->getFormatter());
$model->setCustomer($customer);
$model->setTemplate($template);
$model->addEntries($entries);

View File

@@ -66,10 +66,8 @@ class TwigRendererTest extends KernelTestCase
$filename = $model->getInvoiceNumber() . '-customer_with_special_name';
$this->assertStringContainsString('<title>' . $filename . '</title>', $content);
$this->assertStringContainsString('<h2 class="page-header">
<span contenteditable="true">a very *long* test invoice / template title with [ßpecial] chäracter</span>
</h2>', $content);
$this->assertEquals(2, substr_count($content, 'activity description'));
$this->assertStringContainsString('<span contenteditable="true">a very *long* test invoice / template title with [ßpecial] chäracter</span>', $content);
$this->assertEquals(3, substr_count($content, 'activity description'));
$this->assertStringContainsString(nl2br("foo\n" .
"foo\r\n" .
'foo' . PHP_EOL .

View File

@@ -24,6 +24,7 @@ use App\Invoice\ServiceInvoice;
use App\Repository\InvoiceDocumentRepository;
use App\Repository\InvoiceRepository;
use App\Repository\Query\InvoiceQuery;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use App\Utils\FileHelper;
use PHPUnit\Framework\TestCase;
use Twig\Environment;
@@ -48,7 +49,7 @@ class ServiceInvoiceTest extends TestCase
$repo = new InvoiceDocumentRepository($paths);
$invoiceRepo = $this->createMock(InvoiceRepository::class);
return new ServiceInvoice($repo, new FileHelper(realpath(__DIR__ . '/../../var/data/')), $invoiceRepo, $formattings);
return new ServiceInvoice($repo, new FileHelper(realpath(__DIR__ . '/../../var/data/')), $invoiceRepo, $formattings, (new InvoiceModelFactoryFactory($this))->create());
}
public function testInvalidExceptionOnChangeState()