Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a918d19
7273: Added /** @var Collection<int, X> */ to 20 collection propertie…
tuj May 17, 2026
a87c372
Added missing parameter and return types.
tuj May 17, 2026
46568d3
7273: Added generic-class typehints
tuj May 17, 2026
ab97436
7273: Fixed low hanging phpstan issues
tuj May 17, 2026
034d11f
7273: Fixed trivial misc issues
tuj May 17, 2026
8745620
7273: Fixed 16 specific PHPStan-flagged issues, mostly real bugs the …
tuj May 17, 2026
07962e6
7273: Aligned Doctrine entity property types with database column nul…
tuj May 17, 2026
46879ef
7273: Relaxed 11 ManyToOne foreign keys from `NOT NULL` to `NULL` to …
tuj May 17, 2026
3257d79
7273: Typed parameters
tuj May 17, 2026
55b61fd
7273: Report services now skip worklogs with no associated project or…
tuj May 17, 2026
42bc2bb
7273: Fixed more phpstan raised issues
tuj May 17, 2026
d2387ed
7273: Cleared the long tail of PHPStan call-site bugs
tuj May 17, 2026
1a57db2
7273: Final pass on PHPStan call-site bugs
tuj May 17, 2026
e88fed3
7273: Changed to array json_decode output
tuj May 17, 2026
57b4c62
7273: Shortened changelog entries
tuj May 17, 2026
8e7187d
7273: Changed to asterix
tuj May 18, 2026
67acde1
7273: Fixed merge
tuj May 20, 2026
afe5e53
7273: Added MockObject type to mocks
tuj May 20, 2026
549158f
7273: Removed redundant asserts
tuj May 20, 2026
7310f16
7273: Added inline asserts to tests
tuj May 20, 2026
0ce5e1f
7273: Added asserts
tuj May 20, 2026
90d9e28
7273: Fixed merge
tuj Jun 1, 2026
8ade5ff
7273: Fixed new baseline issues
tuj Jun 1, 2026
d19f434
7273: Shortened changelog entry
tuj Jun 1, 2026
698f185
7273: Cleaned up changelog entry
tuj Jun 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .phpstan-no-baseline.neon
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
parameters:
level: 8
paths:
- src
- tests
excludePaths:
- src/Kernel.php
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

* [PR-308](https://github.com/itk-dev/economics/pull/308)
* PHPStan baseline cleanup in src/ (530 → 0); behavior- and schema-affecting items below.
* Migrations Version20260517131038 and Version20260517151632: relaxed 18 columns and
11 ManyToOne FKs on synced entities (issue, project, version, worklog) to nullable
to match property types; application-layer asserts/form validators still enforce required-ness.
* Fixed report services crashing on worklogs with null project/issue and rendering empty epic
tags (Epic::getName() → getTitle()); fixed SubscriptionHandlerService::getVersion()
lookup by non-existent field.
* LeantimeApiService switched from object to array json_decode; wire shape unchanged.

Comment on lines +11 to +20

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get that this is a big PR, but the size of this entry hurts my eyes, along with the overuse of backticks.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done :)

## [3.5.0] - 2026-05-26

* [PR-315](https://github.com/itk-dev/economics/pull/315)
* Add tidy-feedback collector module.
* [PR-310](https://github.com/itk-dev/economics/pull/310)
* Remove dataProvider scoping.
* [PR-264](https://github.com/itk-dev/economics/pull/264)
Added cybersecurity report.
* Added cybersecurity report.
* [PR-309](https://github.com/itk-dev/economics/pull/309)
* Consolidated project and service-agreement fields.
* Moved the Leantime project link from service agreement to project and rendered it via a Twig helper.
Expand Down
41 changes: 41 additions & 0 deletions migrations/Version20260517131038.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20260517131038 extends AbstractMigration
{
public function getDescription(): string
{
return 'Make columns nullable on synced entities (issue/project/version/worklog) and on app-managed DateTime fields (project_billing period_start/end, service_agreement valid_from) to match PHP property types.';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like the idea that Claude edited this file. Description is not filled out when doctrine generates it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude only wrote the descriptions.

}

public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE issue CHANGE name name VARCHAR(255) DEFAULT NULL, CHANGE project_tracker_id project_tracker_id VARCHAR(255) DEFAULT NULL, CHANGE project_tracker_key project_tracker_key VARCHAR(255) DEFAULT NULL, CHANGE link_to_issue link_to_issue VARCHAR(255) DEFAULT NULL');
$this->addSql('ALTER TABLE project CHANGE name name VARCHAR(255) DEFAULT NULL, CHANGE project_tracker_project_url project_tracker_project_url VARCHAR(255) DEFAULT NULL, CHANGE project_tracker_key project_tracker_key VARCHAR(255) DEFAULT NULL');
$this->addSql('ALTER TABLE project_billing CHANGE period_start period_start DATETIME DEFAULT NULL, CHANGE period_end period_end DATETIME DEFAULT NULL');
$this->addSql('ALTER TABLE service_agreement CHANGE valid_from valid_from DATETIME DEFAULT NULL');
$this->addSql('ALTER TABLE version CHANGE name name VARCHAR(255) DEFAULT NULL, CHANGE project_tracker_id project_tracker_id VARCHAR(255) DEFAULT NULL, CHANGE is_billable is_billable TINYINT(1) DEFAULT NULL');
$this->addSql('ALTER TABLE worklog CHANGE worklog_id worklog_id INT DEFAULT NULL, CHANGE worker worker VARCHAR(255) DEFAULT NULL, CHANGE time_spent_seconds time_spent_seconds INT DEFAULT NULL, CHANGE started started DATETIME DEFAULT NULL, CHANGE project_tracker_issue_id project_tracker_issue_id VARCHAR(255) DEFAULT NULL');
}

public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE project CHANGE name name VARCHAR(255) NOT NULL, CHANGE project_tracker_project_url project_tracker_project_url VARCHAR(255) NOT NULL, CHANGE project_tracker_key project_tracker_key VARCHAR(255) NOT NULL');
$this->addSql('ALTER TABLE worklog CHANGE worklog_id worklog_id INT NOT NULL, CHANGE worker worker VARCHAR(255) NOT NULL, CHANGE time_spent_seconds time_spent_seconds INT NOT NULL, CHANGE started started DATETIME NOT NULL, CHANGE project_tracker_issue_id project_tracker_issue_id VARCHAR(255) NOT NULL');
$this->addSql('ALTER TABLE project_billing CHANGE period_start period_start DATETIME NOT NULL, CHANGE period_end period_end DATETIME NOT NULL');
$this->addSql('ALTER TABLE version CHANGE name name VARCHAR(255) NOT NULL, CHANGE project_tracker_id project_tracker_id VARCHAR(255) NOT NULL, CHANGE is_billable is_billable TINYINT(1) NOT NULL');
$this->addSql('ALTER TABLE service_agreement CHANGE valid_from valid_from DATETIME NOT NULL');
$this->addSql('ALTER TABLE issue CHANGE name name VARCHAR(255) NOT NULL, CHANGE project_tracker_id project_tracker_id VARCHAR(255) NOT NULL, CHANGE project_tracker_key project_tracker_key VARCHAR(255) NOT NULL, CHANGE link_to_issue link_to_issue VARCHAR(255) NOT NULL');
}
}
45 changes: 45 additions & 0 deletions migrations/Version20260517151632.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20260517151632 extends AbstractMigration
{
public function getDescription(): string
{
return 'Make ManyToOne foreign keys nullable on entities whose properties are typed nullable. Aligns DB schema with PHP property types; application/validation layer still enforces required-ness on app-managed entities.';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude only wrote the descriptions.

}

public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE cybersecurity_agreement CHANGE service_agreement_id service_agreement_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE invoice_entry CHANGE invoice_id invoice_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE issue_product CHANGE issue_id issue_id INT DEFAULT NULL, CHANGE product_id product_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE product CHANGE project_id project_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE project_billing CHANGE project_id project_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE service_agreement CHANGE project_id project_id INT DEFAULT NULL, CHANGE client_id client_id INT DEFAULT NULL, CHANGE project_lead_id project_lead_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE version CHANGE project_id project_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE worklog CHANGE issue_id issue_id INT DEFAULT NULL');
}

public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE invoice_entry CHANGE invoice_id invoice_id INT NOT NULL');
$this->addSql('ALTER TABLE worklog CHANGE issue_id issue_id INT NOT NULL');
$this->addSql('ALTER TABLE product CHANGE project_id project_id INT NOT NULL');
$this->addSql('ALTER TABLE issue_product CHANGE issue_id issue_id INT NOT NULL, CHANGE product_id product_id INT NOT NULL');
$this->addSql('ALTER TABLE project_billing CHANGE project_id project_id INT NOT NULL');
$this->addSql('ALTER TABLE version CHANGE project_id project_id INT NOT NULL');
$this->addSql('ALTER TABLE service_agreement CHANGE project_id project_id INT NOT NULL, CHANGE client_id client_id INT NOT NULL, CHANGE project_lead_id project_lead_id INT NOT NULL');
$this->addSql('ALTER TABLE cybersecurity_agreement CHANGE service_agreement_id service_agreement_id INT NOT NULL');
}
}
Loading
Loading