diff --git a/composer.json b/composer.json index f103f49..6e4997c 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ }, "require-dev": { "ext-json": "*", + "illuminate/support": "^9.52", "setasign/fpdf": "^1.8.6", "tecnickcom/tcpdf": "^6.7.0", "setasign/tfpdf": "^1.33.0", diff --git a/composer.lock b/composer.lock index 343fec6..c52deae 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,78 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "585c3de3abe718e3e7ef3771fc39d8b5", + "content-hash": "8eb6f9498df4d97ab691e4ec50c5d76b", "packages": [], "packages-dev": [ + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, { "name": "composer/pcre", "version": "3.3.2", @@ -152,6 +221,96 @@ ], "time": "2024-05-06T16:37:16+00:00" }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, { "name": "doctrine/instantiator", "version": "1.5.0", @@ -222,6 +381,272 @@ ], "time": "2022-12-30T00:15:36+00:00" }, + { + "name": "illuminate/collections", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "d3710b0b244bfc62c288c1a87eaa62dd28352d1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/d3710b0b244bfc62c288c1a87eaa62dd28352d1f", + "reference": "d3710b0b244bfc62c288c1a87eaa62dd28352d1f", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^6.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-06-11T21:17:10+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364", + "reference": "bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364", + "shasum": "" + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-02-01T21:42:32+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "44f65d723b13823baa02ff69751a5948bde60c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/44f65d723b13823baa02ff69751a5948bde60c22", + "reference": "44f65d723b13823baa02ff69751a5948bde60c22", + "shasum": "" + }, + "require": { + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-02-08T14:36:30+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "shasum": "" + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-08-09T13:29:29+00:00" + }, + { + "name": "illuminate/support", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "223c608dbca27232df6213f776bfe7bdeec24874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/223c608dbca27232df6213f776bfe7bdeec24874", + "reference": "223c608dbca27232df6213f776bfe7bdeec24874", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^9.0", + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0.2", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^9.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the composer class (^6.0).", + "symfony/uid": "Required to use Str::ulid() (^6.0).", + "symfony/var-dumper": "Required to use the dd function (^6.0).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-06-11T21:11:53+00:00" + }, { "name": "myclabs/deep-copy", "version": "1.13.4", @@ -280,7 +705,114 @@ "type": "tidelift" } ], - "time": "2025-08-01T08:46:24+00:00" + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.73.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "<6", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-01-08T20:10:23+00:00" }, { "name": "nikic/php-parser", @@ -1232,6 +1764,54 @@ ], "time": "2026-01-27T05:45:00+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -1335,6 +1915,57 @@ }, "time": "2024-09-11T13:17:53+00:00" }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, { "name": "sebastian/cli-parser", "version": "1.0.2", @@ -3301,6 +3932,179 @@ ], "time": "2022-05-30T19:17:58+00:00" }, + { + "name": "symfony/translation", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "9c24b3fdbbe9fb2ef3a6afd8bbaadfd72dad681f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/9c24b3fdbbe9fb2ef3a6afd8bbaadfd72dad681f", + "reference": "9c24b3fdbbe9fb2ef3a6afd8bbaadfd72dad681f", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/acbfbb274e730e5a0236f619b6168d9dedb3e282", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T17:10:44+00:00" + }, { "name": "tecnickcom/tcpdf", "version": "6.11.3", @@ -3509,6 +4313,80 @@ } ], "time": "2022-10-16T00:51:09+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2026-04-26T05:33:54+00:00" } ], "aliases": [], diff --git a/examples/Fpdf/example-table-4-override.pdf b/examples/Fpdf/example-table-4-override.pdf index d137d13..e6c1653 100644 Binary files a/examples/Fpdf/example-table-4-override.pdf and b/examples/Fpdf/example-table-4-override.pdf differ diff --git a/examples/Fpdf/example-table-5-row-height.pdf b/examples/Fpdf/example-table-5-row-height.pdf index 5b71e1d..9a1de0c 100644 Binary files a/examples/Fpdf/example-table-5-row-height.pdf and b/examples/Fpdf/example-table-5-row-height.pdf differ diff --git a/examples/Tcpdf/example-table-4-override.pdf b/examples/Tcpdf/example-table-4-override.pdf index c2e59a2..ca66ab8 100644 Binary files a/examples/Tcpdf/example-table-4-override.pdf and b/examples/Tcpdf/example-table-4-override.pdf differ diff --git a/examples/Tcpdf/example-table-5-row-height.pdf b/examples/Tcpdf/example-table-5-row-height.pdf index 7d4027f..0f383ee 100644 Binary files a/examples/Tcpdf/example-table-5-row-height.pdf and b/examples/Tcpdf/example-table-5-row-height.pdf differ diff --git a/examples/Tfpdf/example-table-4-override.pdf b/examples/Tfpdf/example-table-4-override.pdf index b3e6d3f..b40771f 100644 Binary files a/examples/Tfpdf/example-table-4-override.pdf and b/examples/Tfpdf/example-table-4-override.pdf differ diff --git a/examples/Tfpdf/example-table-5-row-height.pdf b/examples/Tfpdf/example-table-5-row-height.pdf index 7e6a394..5aab2a3 100644 Binary files a/examples/Tfpdf/example-table-5-row-height.pdf and b/examples/Tfpdf/example-table-5-row-height.pdf differ diff --git a/src/Table.php b/src/Table.php index 3d3eb83..bef659f 100644 --- a/src/Table.php +++ b/src/Table.php @@ -1414,9 +1414,6 @@ protected function cachePrepOutputData() $count = count($dataCache); - /** @var CellInterface[] $prevRowData */ - $prevRowData = null; - for ($k = 0; $k < $count; $k++) { $val = &$dataCache[$k]; @@ -1426,7 +1423,6 @@ protected function cachePrepOutputData() if ($val['DATATYPE'] == 'new_page') { //add a new page $this->addPage(); - $prevRowData = null; // page break resets adjacent-row tracking continue; } @@ -1450,25 +1446,6 @@ protected function cachePrepOutputData() $cell->setCellDrawHeight($val['HEIGHT']); } - // Inform the cell whether an already-rendered adjacent border - // sits on its top / left edge so the fill inset can be adjusted. - if (method_exists($cell, 'setAdjacentBorderTop')) { - $cell->setAdjacentBorderTop( - $prevRowData !== null - && isset($prevRowData[$i]) - && method_exists($prevRowData[$i], 'borderIncludesSide') - && $prevRowData[$i]->borderIncludesSide('B') - ); - } - if (method_exists($cell, 'setAdjacentBorderLeft')) { - $cell->setAdjacentBorderLeft( - $i > 0 - && isset($data[$i - 1]) - && method_exists($data[$i - 1], 'borderIncludesSide') - && $data[$i - 1]->borderIncludesSide('R') - ); - } - $cell->render(); } @@ -1477,8 +1454,6 @@ protected function cachePrepOutputData() //if we have colspan, just ignore the next cells } - $prevRowData = $data; - $this->dataOnCurrentPage = true; //Go to the next line diff --git a/src/Table/Cell/CellAbstract.php b/src/Table/Cell/CellAbstract.php index 9aa20dd..aa407de 100644 --- a/src/Table/Cell/CellAbstract.php +++ b/src/Table/Cell/CellAbstract.php @@ -69,7 +69,7 @@ abstract class CellAbstract implements CellInterface */ protected $paddingLeft = 0; - protected $backgroundColor = [255, 255, 255]; + protected $backgroundColor = false; /** * @var string|int @@ -169,18 +169,6 @@ abstract class CellAbstract implements CellInterface */ protected $bSkip = false; - /** - * Whether the adjacent cell above has a bottom border (set by the table renderer). - * Used to protect that border from being covered by this cell's fill. - */ - protected bool $adjacentBorderTop = false; - - /** - * Whether the adjacent cell to the left has a right border (set by the table renderer). - * Used to protect that border from being covered by this cell's fill. - */ - protected bool $adjacentBorderLeft = false; - public function __construct($pdf) { if ($pdf instanceof PdfInterface) { @@ -406,32 +394,6 @@ public function getSkipped(): bool return $this->bSkip; } - public function setAdjacentBorderTop(bool $value): void - { - $this->adjacentBorderTop = $value; - } - - public function setAdjacentBorderLeft(bool $value): void - { - $this->adjacentBorderLeft = $value; - } - - /** - * Returns true if this cell's border type includes the given side ('T', 'B', 'L', 'R'). - */ - public function borderIncludesSide(string $side): bool - { - $bt = $this->getBorderType(); - if ($bt === 1 || $bt === '1') { - return true; - } - if ($bt === 0 || $bt === '0' || $bt === '') { - return false; - } - - return strpos((string) $bt, $side) !== false; - } - public function __get($property) { if (isset($this->properties[$property])) { @@ -486,50 +448,29 @@ public function renderCellLayout() $this->pdf->SetDrawColor($r, $g, $b); $borderType = $this->getBorderType(); - $width = $this->getCellDrawWidth(); - $height = $this->getCellDrawHeight(); - $borderSize = $this->getBorderSize(); - - // For any border type other than 0 (no border) or 1 (all borders with Cell()), - // draw manually to avoid overwriting adjacent borders - if ($borderType !== 0 && $borderType !== '0' && $borderType !== 1 && $borderType !== '1') { - $borderStr = (string) $borderType; - $hasTop = strpos($borderStr, 'T') !== false; - $hasBottom = strpos($borderStr, 'B') !== false; - $hasLeft = strpos($borderStr, 'L') !== false; - $hasRight = strpos($borderStr, 'R') !== false; - - // Inset on sides that have a border on THIS cell, or where an adjacent - // cell already drew a border on the shared edge (to avoid covering it). + + // For single-sided borders, draw manually to avoid corner artifacts and overlap issues + if ($borderType === 'B' || $borderType === 'T' || $borderType === 'L' || $borderType === 'R') { + $width = $this->getCellDrawWidth(); + $height = $this->getCellDrawHeight(); + + // Draw background using Rect to avoid overwriting adjacent borders if (! $this->isTransparent()) { - $insetLeft = ($hasLeft || $this->adjacentBorderLeft) ? $borderSize / 2 : 0; - $insetRight = $hasRight ? $borderSize / 2 : 0; - $insetTop = ($hasTop || $this->adjacentBorderTop) ? $borderSize / 2 : 0; - $insetBottom = $hasBottom ? $borderSize / 2 : 0; - $this->pdf->Rect( - $x + $insetLeft, - $y + $insetTop, - max(0, $width - $insetLeft - $insetRight), - max(0, $height - $insetTop - $insetBottom), - 'F' - ); + $this->pdf->Rect($x, $y, $width, $height, 'F'); } - // Manually draw each requested border side - if ($hasTop) { - $this->pdf->Line($x, $y, $x + $width, $y); - } - if ($hasBottom) { + // Manually draw the specific border + if ($borderType === 'B') { $this->pdf->Line($x, $y + $height, $x + $width, $y + $height); - } - if ($hasLeft) { + } elseif ($borderType === 'T') { + $this->pdf->Line($x, $y, $x + $width, $y); + } elseif ($borderType === 'L') { $this->pdf->Line($x, $y, $x, $y + $height); - } - if ($hasRight) { + } elseif ($borderType === 'R') { $this->pdf->Line($x + $width, $y, $x + $width, $y + $height); } } else { - // For 0 (no border) or 1 (all sides), use standard Cell() + // For other border types (all sides, combinations), use standard Cell() $this->pdf->Cell( $this->getCellDrawWidth(), $this->getCellDrawHeight(), diff --git a/src/Table/Cell/CellInterface.php b/src/Table/Cell/CellInterface.php index a8c7cb1..e4d3607 100644 --- a/src/Table/Cell/CellInterface.php +++ b/src/Table/Cell/CellInterface.php @@ -172,7 +172,7 @@ public function getBorderType(); /** * Sets the Border Color. - * If the value is set to FALSE, 0 or '0' then we assume transparency + * If the value is set to FALSE, 0, '0' or NULL then we assume transparency * * @param int|bool|array $r */ diff --git a/src/Tools.php b/src/Tools.php index a240c11..db736b3 100644 --- a/src/Tools.php +++ b/src/Tools.php @@ -112,7 +112,7 @@ public static function makeArray($value): array } /** - * Returns TRUE if value is FALSE(0, '0', FALSE) + * Returns TRUE if value is FALSE(0, '0', FALSE, NULL) * * @param mixed $value */ @@ -122,6 +122,10 @@ public static function isFalse($value): bool return true; } + if (null === $value) { + return true; + } + if (0 === $value) { return true; } diff --git a/tests/Unit/ToolsTest.php b/tests/Unit/ToolsTest.php index 94eaf23..2cc620d 100644 --- a/tests/Unit/ToolsTest.php +++ b/tests/Unit/ToolsTest.php @@ -48,4 +48,21 @@ public function testHex2rgb(): void $this->assertSame(null, Tools::hex2rgb('#f4')); $this->assertSame(null, Tools::hex2rgb('f489')); } + + public function testIsFalse(): void + { + // Test false values + $this->assertTrue(Tools::isFalse(false)); + $this->assertTrue(Tools::isFalse(0)); + $this->assertTrue(Tools::isFalse('0')); + $this->assertTrue(Tools::isFalse(null)); + + // Test non-false values + $this->assertFalse(Tools::isFalse(true)); + $this->assertFalse(Tools::isFalse(1)); + $this->assertFalse(Tools::isFalse('1')); + $this->assertFalse(Tools::isFalse('')); + $this->assertFalse(Tools::isFalse([])); + $this->assertFalse(Tools::isFalse([255, 255, 255])); + } } diff --git a/tests/_files/dev/Fpdf/multi-page-draw-table-model1.png b/tests/_files/dev/Fpdf/multi-page-draw-table-model1.png index 62e199c..c4398d4 100644 Binary files a/tests/_files/dev/Fpdf/multi-page-draw-table-model1.png and b/tests/_files/dev/Fpdf/multi-page-draw-table-model1.png differ diff --git a/tests/_files/dev/Fpdf/multi-page-draw-table-model2.png b/tests/_files/dev/Fpdf/multi-page-draw-table-model2.png index c6c76c9..3425cf2 100644 Binary files a/tests/_files/dev/Fpdf/multi-page-draw-table-model2.png and b/tests/_files/dev/Fpdf/multi-page-draw-table-model2.png differ diff --git a/tests/_files/dev/Fpdf/multi-page-draw-table-model3.png b/tests/_files/dev/Fpdf/multi-page-draw-table-model3.png index d6fbe14..bf11188 100644 Binary files a/tests/_files/dev/Fpdf/multi-page-draw-table-model3.png and b/tests/_files/dev/Fpdf/multi-page-draw-table-model3.png differ diff --git a/tests/_files/dev/Fpdf/test-multicell-align.png b/tests/_files/dev/Fpdf/test-multicell-align.png index 54b50df..7e96e34 100644 Binary files a/tests/_files/dev/Fpdf/test-multicell-align.png and b/tests/_files/dev/Fpdf/test-multicell-align.png differ diff --git a/tests/_files/dev/Fpdf/test-multicell-shrinking.png b/tests/_files/dev/Fpdf/test-multicell-shrinking.png index 0635cb3..c253454 100644 Binary files a/tests/_files/dev/Fpdf/test-multicell-shrinking.png and b/tests/_files/dev/Fpdf/test-multicell-shrinking.png differ diff --git a/tests/_files/dev/Fpdf/test-multicell-shrinking2.png b/tests/_files/dev/Fpdf/test-multicell-shrinking2.png index d24fc6e..57b2522 100644 Binary files a/tests/_files/dev/Fpdf/test-multicell-shrinking2.png and b/tests/_files/dev/Fpdf/test-multicell-shrinking2.png differ diff --git a/tests/_files/dev/Fpdf/test-multicell-style.png b/tests/_files/dev/Fpdf/test-multicell-style.png index 4b1b5ff..19fab4d 100644 Binary files a/tests/_files/dev/Fpdf/test-multicell-style.png and b/tests/_files/dev/Fpdf/test-multicell-style.png differ diff --git a/tests/_files/dev/Tcpdf/multi-page-draw-table-model1.png b/tests/_files/dev/Tcpdf/multi-page-draw-table-model1.png index 305122d..631e403 100644 Binary files a/tests/_files/dev/Tcpdf/multi-page-draw-table-model1.png and b/tests/_files/dev/Tcpdf/multi-page-draw-table-model1.png differ diff --git a/tests/_files/dev/Tcpdf/multi-page-draw-table-model2.png b/tests/_files/dev/Tcpdf/multi-page-draw-table-model2.png index 2255882..a7ab03f 100644 Binary files a/tests/_files/dev/Tcpdf/multi-page-draw-table-model2.png and b/tests/_files/dev/Tcpdf/multi-page-draw-table-model2.png differ diff --git a/tests/_files/dev/Tcpdf/multi-page-draw-table-model3.png b/tests/_files/dev/Tcpdf/multi-page-draw-table-model3.png index d55b4fc..298dd69 100644 Binary files a/tests/_files/dev/Tcpdf/multi-page-draw-table-model3.png and b/tests/_files/dev/Tcpdf/multi-page-draw-table-model3.png differ diff --git a/tests/_files/dev/Tcpdf/test-multicell-align.png b/tests/_files/dev/Tcpdf/test-multicell-align.png index 59ecf37..6d99179 100644 Binary files a/tests/_files/dev/Tcpdf/test-multicell-align.png and b/tests/_files/dev/Tcpdf/test-multicell-align.png differ diff --git a/tests/_files/dev/Tcpdf/test-multicell-shrinking.png b/tests/_files/dev/Tcpdf/test-multicell-shrinking.png index 04b7f70..37a80a0 100644 Binary files a/tests/_files/dev/Tcpdf/test-multicell-shrinking.png and b/tests/_files/dev/Tcpdf/test-multicell-shrinking.png differ diff --git a/tests/_files/dev/Tcpdf/test-multicell-shrinking2.png b/tests/_files/dev/Tcpdf/test-multicell-shrinking2.png index 2454118..b2062ca 100644 Binary files a/tests/_files/dev/Tcpdf/test-multicell-shrinking2.png and b/tests/_files/dev/Tcpdf/test-multicell-shrinking2.png differ diff --git a/tests/_files/dev/Tcpdf/test-multicell-style.png b/tests/_files/dev/Tcpdf/test-multicell-style.png index 3fcb807..434ee19 100644 Binary files a/tests/_files/dev/Tcpdf/test-multicell-style.png and b/tests/_files/dev/Tcpdf/test-multicell-style.png differ diff --git a/tests/_files/dev/Tfpdf/multi-page-draw-table-model1.png b/tests/_files/dev/Tfpdf/multi-page-draw-table-model1.png index 7178b28..43c59e5 100644 Binary files a/tests/_files/dev/Tfpdf/multi-page-draw-table-model1.png and b/tests/_files/dev/Tfpdf/multi-page-draw-table-model1.png differ diff --git a/tests/_files/dev/Tfpdf/multi-page-draw-table-model2.png b/tests/_files/dev/Tfpdf/multi-page-draw-table-model2.png index 15b6ffb..8e95647 100644 Binary files a/tests/_files/dev/Tfpdf/multi-page-draw-table-model2.png and b/tests/_files/dev/Tfpdf/multi-page-draw-table-model2.png differ diff --git a/tests/_files/dev/Tfpdf/multi-page-draw-table-model3.png b/tests/_files/dev/Tfpdf/multi-page-draw-table-model3.png index e0ea73c..4201b23 100644 Binary files a/tests/_files/dev/Tfpdf/multi-page-draw-table-model3.png and b/tests/_files/dev/Tfpdf/multi-page-draw-table-model3.png differ diff --git a/tests/_files/dev/Tfpdf/test-multicell-align.png b/tests/_files/dev/Tfpdf/test-multicell-align.png index 3fef0ef..00b4df7 100644 Binary files a/tests/_files/dev/Tfpdf/test-multicell-align.png and b/tests/_files/dev/Tfpdf/test-multicell-align.png differ diff --git a/tests/_files/dev/Tfpdf/test-multicell-shrinking.png b/tests/_files/dev/Tfpdf/test-multicell-shrinking.png index 90cc0a3..20e8778 100644 Binary files a/tests/_files/dev/Tfpdf/test-multicell-shrinking.png and b/tests/_files/dev/Tfpdf/test-multicell-shrinking.png differ diff --git a/tests/_files/dev/Tfpdf/test-multicell-shrinking2.png b/tests/_files/dev/Tfpdf/test-multicell-shrinking2.png index be1adb5..9f0be45 100644 Binary files a/tests/_files/dev/Tfpdf/test-multicell-shrinking2.png and b/tests/_files/dev/Tfpdf/test-multicell-shrinking2.png differ diff --git a/tests/_files/dev/Tfpdf/test-multicell-style.png b/tests/_files/dev/Tfpdf/test-multicell-style.png index 1d5b6db..d7557d9 100644 Binary files a/tests/_files/dev/Tfpdf/test-multicell-style.png and b/tests/_files/dev/Tfpdf/test-multicell-style.png differ