From 1232a230529c935ca66463c5c205640505577d21 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 10:47:21 -0600 Subject: [PATCH 01/19] Rename $pagos & $pago to $pagos10 $pago10 for better readability --- templates/generic.php | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/templates/generic.php b/templates/generic.php index 7dd02a0..babd548 100644 --- a/templates/generic.php +++ b/templates/generic.php @@ -286,64 +286,64 @@ searchNodes('cfdi:Complemento', 'pago10:Pagos', 'pago10:Pago'); + $pagos10 = $comprobante->searchNodes('cfdi:Complemento', 'pago10:Pagos', 'pago10:Pago'); $pagoCounter = 0; - $pagoCount = $pagos->count(); + $pagoCount = $pagos10->count(); ?> - + searchNodes('pago10:DoctoRelacionado'); + $doctoRelacionados = $pago10->searchNodes('pago10:DoctoRelacionado'); ?>
Pago: e($pagoCounter)?> de e($pagoCount)?>

- Fecha de pago: e($pago['FechaPago'])?>, - Forma de pago: e($pago['FormaDePagoP'])?>, - Moneda: e($pago['MonedaP'])?>, - Monto: e($pago['Monto'])?> - - Tipo Cambio: e($pago['TipoCambioP'])?> + Fecha de pago: e($pago10['FechaPago'])?>, + Forma de pago: e($pago10['FormaDePagoP'])?>, + Moneda: e($pago10['MonedaP'])?>, + Monto: e($pago10['Monto'])?> + + Tipo Cambio: e($pago10['TipoCambioP'])?> - - Número operación: e($pago['NumOperacion'])?> + + Número operación: e($pago10['NumOperacion'])?> - - RFC Emisor Cta Ord: e($pago['RfcEmisorCtaOrd'])?> + + RFC Emisor Cta Ord: e($pago10['RfcEmisorCtaOrd'])?> - - Nombre Banco Ord Extranjero: e($pago['NomBancoOrdExt'])?> + + Nombre Banco Ord Extranjero: e($pago10['NomBancoOrdExt'])?> - - Cuenta Ord: e($pago['CtaOrdenante'])?> + + Cuenta Ord: e($pago10['CtaOrdenante'])?> - - RFC Emisor Cta Ben: e($pago['RfcEmisorCtaBen'])?> + + RFC Emisor Cta Ben: e($pago10['RfcEmisorCtaBen'])?> - - Cuenta Ben: e($pago['CtaBeneficiario'])?> + + Cuenta Ben: e($pago10['CtaBeneficiario'])?> - - Tipo cadena de pago: e($pago['TipoCadPago'])?> + + Tipo cadena de pago: e($pago10['TipoCadPago'])?>

- +

Certificado de pago: - e($pago['CertPago'])?> + e($pago10['CertPago'])?>

- +

Cadena de pago: - e($pago['CadPago'])?> + e($pago10['CadPago'])?>

- +

Sello de pago: - e($pago['SelloPago'])?> + e($pago10['SelloPago'])?>

count() > 0) : ?> From 8dc8a52b9a6806caf73f87eb82d1405e6e5cc6e4 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 10:48:32 -0600 Subject: [PATCH 02/19] =?UTF-8?q?Fix=20typo=20"Informaci=C3=B3n"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/generic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/generic.php b/templates/generic.php index babd548..92e6b08 100644 --- a/templates/generic.php +++ b/templates/generic.php @@ -235,7 +235,7 @@

- Informacion aduanera + Información aduanera searchNodes('cfdi:InformacionAduanera') as $informacionAduanera) : ?> Pedimento: e($informacionAduanera['NumeroPedimento'])?> From 099ba9b18d3fd9b50feed06bbffe8c4fe439165b Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 10:49:19 -0600 Subject: [PATCH 03/19] Remove unused TravisCI file --- .gitattributes | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 3196ce1..b1f2fb0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,7 +15,6 @@ /.gitignore export-ignore /.php-cs-fixer.dist.php export-ignore /.scrutinizer.yml export-ignore -/.travis.yml export-ignore /phpcs.xml.dist export-ignore /phpstan.neon.dist export-ignore /phpunit.xml.dist export-ignore From 4f07c1cf2045bbb3c8911ca0741bdcc9fb168704 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 10:49:46 -0600 Subject: [PATCH 04/19] Add box (tool to create phar file) config file --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index b1f2fb0..610cdbd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,6 +15,7 @@ /.gitignore export-ignore /.php-cs-fixer.dist.php export-ignore /.scrutinizer.yml export-ignore +/box.json.dist export-ignore /phpcs.xml.dist export-ignore /phpstan.neon.dist export-ignore /phpunit.xml.dist export-ignore From 9a0df374076298268d9c2bd1633edb4a4fc325b4 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 10:51:19 -0600 Subject: [PATCH 05/19] Remove Scrutinizer-CI. Thanks! --- .gitattributes | 1 - .github/workflows/build.yml | 13 ++----------- .scrutinizer.yml | 23 ----------------------- README.md | 6 ------ 4 files changed, 2 insertions(+), 41 deletions(-) delete mode 100644 .scrutinizer.yml diff --git a/.gitattributes b/.gitattributes index 610cdbd..4f499cf 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14,7 +14,6 @@ /.gitattributes export-ignore /.gitignore export-ignore /.php-cs-fixer.dist.php export-ignore -/.scrutinizer.yml export-ignore /box.json.dist export-ignore /phpcs.xml.dist export-ignore /phpstan.neon.dist export-ignore diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd3a0da..936c74e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,6 @@ on: # Actions # shivammathur/setup-php@v2 https://github.com/marketplace/actions/setup-php-action -# sudo-bot/action-scrutinizer@latest https://github.com/marketplace/actions/action-scrutinizer jobs: @@ -103,8 +102,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - fetch-depth: 0 # required for sudo-bot/action-scrutinizer - name: Install poppler-utils run: | sudo apt-get update -y -qq @@ -114,7 +111,7 @@ jobs: with: php-version: ${{ matrix.php-version }} extensions: soap, gd - coverage: xdebug + coverage: none tools: composer:v2 env: fail-fast: true @@ -141,10 +138,4 @@ jobs: - name: Install project dependencies run: composer upgrade --no-interaction --no-progress --prefer-dist - name: Tests (phpunit) - run: vendor/bin/phpunit --testdox --verbose --coverage-clover=build/coverage-clover.xml - - name: Upload code coverage to scrutinizer - if: ${{ !env.ACT }} # do not run if using nektos/act - uses: sudo-bot/action-scrutinizer@latest - with: - cli-args: "--format=php-clover build/coverage-clover.xml" - continue-on-error: true + run: vendor/bin/phpunit --testdox --verbose diff --git a/.scrutinizer.yml b/.scrutinizer.yml deleted file mode 100644 index 7b8c5f9..0000000 --- a/.scrutinizer.yml +++ /dev/null @@ -1,23 +0,0 @@ -filter: - excluded_paths: - - 'tests/' - - 'vendor/' - -# see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/ -build: - dependencies: - before: - - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" - - php composer-setup.php --install-dir=$HOME/bin --filename=composer - - php -r "unlink('composer-setup.php');" - - $HOME/bin/composer --version - override: - - composer update --no-interaction - nodes: - php: - tests: - override: - - php-scrutinizer-run --enable-security-analysis - -tools: - external_code_coverage: true diff --git a/README.md b/README.md index bd8735c..30480f4 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,6 @@ [![Latest Version][badge-release]][release] [![Software License][badge-license]][license] [![Build Status][badge-build]][build] -[![Scrutinizer][badge-quality]][quality] -[![Coverage Status][badge-coverage]][coverage] [![Total Downloads][badge-downloads]][downloads] > Create a generic PDF file from a CFDI 3.3 & 4.0 @@ -119,8 +117,6 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor [release]: https://github.com/phpcfdi/cfditopdf/releases [license]: https://github.com/phpcfdi/cfditopdf/blob/master/LICENSE [build]: https://github.com/phpcfdi/cfditopdf/actions/workflows/build.yml?query=branch:master -[quality]: https://scrutinizer-ci.com/g/phpcfdi/cfditopdf/ -[coverage]: https://scrutinizer-ci.com/g/phpcfdi/cfditopdf/code-structure/master/code-coverage/src [downloads]: https://packagist.org/packages/phpcfdi/cfditopdf [badge-source]: https://img.shields.io/badge/source-phpcfdi/cfditopdf-blue?style=flat-square @@ -128,6 +124,4 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor [badge-release]: https://img.shields.io/github/release/phpcfdi/cfditopdf?style=flat-square [badge-license]: https://img.shields.io/github/license/phpcfdi/cfditopdf?style=flat-square [badge-build]: https://img.shields.io/github/actions/workflow/status/phpcfdi/cfditopdf/build.yml?branch=master&style=flat-square -[badge-quality]: https://img.shields.io/scrutinizer/g/phpcfdi/cfditopdf/master?style=flat-square -[badge-coverage]: https://img.shields.io/scrutinizer/coverage/g/phpcfdi/cfditopdf/master?style=flat-square [badge-downloads]: https://img.shields.io/packagist/dt/phpcfdi/cfditopdf?style=flat-square From e38e6e3de6e97b0419e5cab1a1c2de8db4aee2a9 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 11:05:32 -0600 Subject: [PATCH 06/19] Set step "Install SAT XML resources" before "Setup PHP" --- .github/workflows/build.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 936c74e..0c1a9ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -106,15 +106,6 @@ jobs: run: | sudo apt-get update -y -qq sudo apt-get install -y -qq poppler-utils - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-version }} - extensions: soap, gd - coverage: none - tools: composer:v2 - env: - fail-fast: true - name: Install SAT XML resources shell: bash run: | @@ -126,6 +117,15 @@ jobs: else echo tests/_files/external-resources already exists fi + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: soap, gd + coverage: none + tools: composer:v2 + env: + fail-fast: true - name: Get composer cache directory id: composer-cache run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT From e982accce9b2f9136eaacb8b171a3ed18a33fb4e Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 11:09:34 -0600 Subject: [PATCH 07/19] Integrate with SonarQube Cloud --- .github/workflows/sonarqube-cloud.yml | 67 +++++++++++++++++++++++++++ sonar-project.properties | 10 ++++ 2 files changed, 77 insertions(+) create mode 100644 .github/workflows/sonarqube-cloud.yml create mode 100644 sonar-project.properties diff --git a/.github/workflows/sonarqube-cloud.yml b/.github/workflows/sonarqube-cloud.yml new file mode 100644 index 0000000..011d1c1 --- /dev/null +++ b/.github/workflows/sonarqube-cloud.yml @@ -0,0 +1,67 @@ +name: "SonarQube Cloud" +on: + # secrets are not passed to workflows that are triggered by a pull request from a fork. + # see https://docs.github.com/en/actions/reference/encrypted-secrets + workflow_dispatch: + push: + branches: [ "master" ] + +# Actions +# shivammathur/setup-php@v2 https://github.com/marketplace/actions/setup-php-action +# SonarSource/sonarqube-scan-action@v6 https://github.com/marketplace/actions/official-sonarqube-scan + +jobs: + + sonarqube-cloud: + name: SonarCloud Scan and Report + runs-on: "ubuntu-latest" + steps: + - name: Check SONAR_TOKEN secret + run: | + if [ -z "${{ secrets.SONAR_TOKEN }}" ]; then + echo "::warning ::SONAR_TOKEN non set" + exit 1 + fi + - name: Checkout + uses: actions/checkout@v4 + - name: Unshallow clone to provide blame information + run: git fetch --unshallow + - name: Install poppler-utils + run: | + sudo apt-get update -y -qq + sudo apt-get install -y -qq poppler-utils + - name: Install SAT XML resources + shell: bash + run: | + rm -r -f tests/_files/external-resources + git clone --depth 1 https://github.com/phpcfdi/resources-sat-xml resources-sat-xml-cloned + mv resources-sat-xml-cloned/resources tests/_files/external-resources + rm -r -f resources-sat-xml-cloned + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.4' + extensions: soap, gd + coverage: xdebug + tools: composer:v2 + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + - name: Install project dependencies + run: composer upgrade --no-interaction --no-progress --prefer-dist + - name: Create code coverage + run: vendor/bin/phpunit --testdox --verbose --coverage-xml=build/coverage --coverage-clover=build/coverage/clover.xml --log-junit=build/coverage/junit.xml + - name: Prepare SonarCloud Code Coverage Files + run: | + sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/junit.xml > build/sonar-junit.xml + sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/clover.xml > build/sonar-coverage.xml + - name: SonarCloud Scan + uses: SonarSource/sonarqube-scan-action@v6 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..7558159 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,10 @@ +sonar.organization=phpcfdi +sonar.projectKey=phpcfdi_cfditopdf +sonar.sourceEncoding=UTF-8 +sonar.language=php +sonar.sources=src +sonar.tests=tests +sonar.test.exclusions=tests/_files/**/* +sonar.working.directory=build/.scannerwork +sonar.php.tests.reportPath=build/sonar-junit.xml +sonar.php.coverage.reportPaths=build/sonar-coverage.xml \ No newline at end of file From f3441d93f61c69bab7231d423dec39331e3eae84 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 11:09:51 -0600 Subject: [PATCH 08/19] Use standard badges --- README.md | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 30480f4..bc2562e 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,16 @@ [![Source Code][badge-source]][source] [![Packagist PHP Version Support][badge-php-version]][php-version] +[![Discord][badge-discord]][discord] [![Latest Version][badge-release]][release] [![Software License][badge-license]][license] [![Build Status][badge-build]][build] +[![Reliability][badge-reliability]][reliability] +[![Maintainability][badge-maintainability]][maintainability] +[![Code Coverage][badge-coverage]][coverage] +[![Violations][badge-violations]][violations] [![Total Downloads][badge-downloads]][downloads] +[![Docker Downloads][badge-docker]][docker] > Create a generic PDF file from a CFDI 3.3 & 4.0 @@ -114,14 +120,26 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor [source]: https://github.com/phpcfdi/cfditopdf [php-version]: https://packagist.org/packages/phpcfdi/cfditopdf +[discord]: https://discord.gg/aFGYXvX [release]: https://github.com/phpcfdi/cfditopdf/releases [license]: https://github.com/phpcfdi/cfditopdf/blob/master/LICENSE [build]: https://github.com/phpcfdi/cfditopdf/actions/workflows/build.yml?query=branch:master +[reliability]:https://sonarcloud.io/component_measures?id=phpcfdi_cfditopdf&metric=Reliability +[maintainability]: https://sonarcloud.io/component_measures?id=phpcfdi_cfditopdf&metric=Maintainability +[coverage]: https://sonarcloud.io/component_measures?id=phpcfdi_cfditopdf&metric=Coverage +[violations]: https://sonarcloud.io/project/issues?id=phpcfdi_cfditopdf&resolved=false [downloads]: https://packagist.org/packages/phpcfdi/cfditopdf - -[badge-source]: https://img.shields.io/badge/source-phpcfdi/cfditopdf-blue?style=flat-square -[badge-php-version]: https://img.shields.io/packagist/php-v/phpcfdi/cfditopdf?style=flat-square -[badge-release]: https://img.shields.io/github/release/phpcfdi/cfditopdf?style=flat-square -[badge-license]: https://img.shields.io/github/license/phpcfdi/cfditopdf?style=flat-square -[badge-build]: https://img.shields.io/github/actions/workflow/status/phpcfdi/cfditopdf/build.yml?branch=master&style=flat-square -[badge-downloads]: https://img.shields.io/packagist/dt/phpcfdi/cfditopdf?style=flat-square +[docker]: https://hub.docker.com/r/phpcfdi/cfditopdf + +[badge-source]: https://img.shields.io/badge/source-phpcfdi/cfditopdf-blue?logo=github +[badge-discord]: https://img.shields.io/discord/459860554090283019?logo=discord +[badge-php-version]: https://img.shields.io/packagist/php-v/phpcfdi/cfditopdf?logo=php +[badge-release]: https://img.shields.io/github/release/phpcfdi/cfditopdf?logo=git +[badge-license]: https://img.shields.io/github/license/phpcfdi/cfditopdf?logo=open-source-initiative +[badge-build]: https://img.shields.io/github/actions/workflow/status/phpcfdi/cfditopdf/build.yml?branch=master&logo=github-actions +[badge-reliability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_cfditopdf&metric=reliability_rating +[badge-maintainability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_cfditopdf&metric=sqale_rating +[badge-coverage]: https://img.shields.io/sonar/coverage/phpcfdi_cfditopdf/master?logo=sonarqubecloud&server=https%3A%2F%2Fsonarcloud.io +[badge-violations]: https://img.shields.io/sonar/violations/phpcfdi_cfditopdf/master?format=long&logo=sonarqubecloud&server=https%3A%2F%2Fsonarcloud.io +[badge-downloads]: https://img.shields.io/packagist/dt/phpcfdi/cfditopdf?logo=packagist +[badge-docker]: https://img.shields.io/docker/pulls/phpcfdi/cfditopdf?logo=docker From d8e9e9a5d74462b16c88e6f7007d56573d27540f Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 11:13:08 -0600 Subject: [PATCH 09/19] Fix code standard --- templates/generic.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/templates/generic.php b/templates/generic.php index 92e6b08..25618cd 100644 --- a/templates/generic.php +++ b/templates/generic.php @@ -313,7 +313,10 @@ RFC Emisor Cta Ord: e($pago10['RfcEmisorCtaOrd'])?> - Nombre Banco Ord Extranjero: e($pago10['NomBancoOrdExt'])?> + + Nombre Banco Ord Extranjero: + e($pago10['NomBancoOrdExt'])?> + Cuenta Ord: e($pago10['CtaOrdenante'])?> From 364c916368b7ee3be90215c2fd22298970842219 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 11:14:51 -0600 Subject: [PATCH 10/19] Remove sonar-project.properties from github package --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 4f499cf..3e9a887 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18,6 +18,7 @@ /phpcs.xml.dist export-ignore /phpstan.neon.dist export-ignore /phpunit.xml.dist export-ignore +/sonar-project.properties export-ignore # Do not count these files on github code language /tests/_files/** linguist-detectable=false From f79cec2b09c24fba5fca8f34ec73e0a4f78a8bfd Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 11:22:40 -0600 Subject: [PATCH 11/19] Improve code to PHP 7.3 --- .php-cs-fixer.dist.php | 2 +- src/Builders/BuilderInterface.php | 4 ---- src/Builders/Html2PdfBuilder.php | 9 ++------- src/Builders/HtmlTranslators/HtmlTranslatorInterface.php | 3 --- src/Builders/HtmlTranslators/PlatesHtmlTranslator.php | 3 --- src/CfdiData.php | 2 -- src/CfdiDataBuilder.php | 3 --- src/Converter.php | 5 ----- src/Script/ConvertOptions.php | 8 +++----- src/Script/ConvertScript.php | 8 -------- tests/PdfToText/PdfToText.php | 3 +-- 11 files changed, 7 insertions(+), 43 deletions(-) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 3688dd7..482ef43 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -15,8 +15,8 @@ ->setRules([ '@PSR12' => true, '@PSR12:risky' => true, - '@PHP7x1Migration:risky' => true, '@PHP7x3Migration' => true, + '@PHP7x1Migration:risky' => true, // basic 'statement_indentation' => false, // invalid indentation // symfony diff --git a/src/Builders/BuilderInterface.php b/src/Builders/BuilderInterface.php index 5916ba0..0472ff7 100644 --- a/src/Builders/BuilderInterface.php +++ b/src/Builders/BuilderInterface.php @@ -11,10 +11,6 @@ interface BuilderInterface /** * Transform CfdiData contents to a PDF file * and store its contents on $destination - * - * @param CfdiData $data - * @param string $destination - * @return void */ public function build(CfdiData $data, string $destination): void; } diff --git a/src/Builders/Html2PdfBuilder.php b/src/Builders/Html2PdfBuilder.php index 1fef243..e611aff 100644 --- a/src/Builders/Html2PdfBuilder.php +++ b/src/Builders/Html2PdfBuilder.php @@ -38,15 +38,11 @@ public function build(CfdiData $data, string $destination): void /** * Transforms CfdiData to Pdf string - * - * @param CfdiData $data - * @return string */ public function buildPdf(CfdiData $data): string { $html = $this->convertNodeToHtml($data); - $output = $this->convertHtmlToPdf($html); - return $output; + return $this->convertHtmlToPdf($html); } public function convertHtmlToPdf(string $html): string @@ -55,8 +51,7 @@ public function convertHtmlToPdf(string $html): string try { $html2Pdf = new Html2Pdf('P', 'Letter', 'es', true, 'UTF-8', [10, 10, 10, 10]); $html2Pdf->writeHTML($html); - $output = $html2Pdf->output('', 'S'); - return $output; + return $html2Pdf->output('', 'S'); } catch (Html2PdfException $exception) { /** @codeCoverageIgnore don't know how to invoke this exception on Html2Pdf */ throw new RuntimeException('Unable to convert CFDI', 0, $exception); diff --git a/src/Builders/HtmlTranslators/HtmlTranslatorInterface.php b/src/Builders/HtmlTranslators/HtmlTranslatorInterface.php index 2e23194..4ae0645 100644 --- a/src/Builders/HtmlTranslators/HtmlTranslatorInterface.php +++ b/src/Builders/HtmlTranslators/HtmlTranslatorInterface.php @@ -10,9 +10,6 @@ interface HtmlTranslatorInterface { /** * Transform CfdiData contents to HTML content - * - * @param CfdiData $cfdiData - * @return string */ public function translate(CfdiData $cfdiData): string; } diff --git a/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php b/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php index bc1dd76..b2c86d5 100644 --- a/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php +++ b/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php @@ -17,9 +17,6 @@ class PlatesHtmlTranslator implements HtmlTranslatorInterface /** * PlatesHtmlTranslator constructor. - * - * @param string $directory - * @param string $template */ public function __construct(string $directory, string $template) { diff --git a/src/CfdiData.php b/src/CfdiData.php index e41977b..f1ea624 100644 --- a/src/CfdiData.php +++ b/src/CfdiData.php @@ -31,8 +31,6 @@ class CfdiData * CfdiData constructor. * * @param NodeInterface $comprobante - * @param string $qrUrl - * @param string $tfdSourceString */ public function __construct(NodeInterface $comprobante, string $qrUrl, string $tfdSourceString) { diff --git a/src/CfdiDataBuilder.php b/src/CfdiDataBuilder.php index ea43507..3986e60 100644 --- a/src/CfdiDataBuilder.php +++ b/src/CfdiDataBuilder.php @@ -53,7 +53,6 @@ public function xsltBuilder(): XsltBuilderInterface /** * @param NodeInterface $comprobante - * @return CfdiData */ public function build(NodeInterface $comprobante): CfdiData { @@ -66,7 +65,6 @@ public function build(NodeInterface $comprobante): CfdiData /** * @param NodeInterface $comprobante - * @return string */ public function createTfdSourceString(NodeInterface $comprobante): string { @@ -83,7 +81,6 @@ public function createTfdSourceString(NodeInterface $comprobante): string /** * @param NodeInterface $comprobante - * @return string */ public function createQrUrl(NodeInterface $comprobante): string { diff --git a/src/Converter.php b/src/Converter.php index 8e56dcc..aa23bf5 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -19,11 +19,6 @@ public function __construct(BuilderInterface $builder) $this->builder = $builder; } - /** - * @param CfdiData $cfdiData - * @param string $destination - * @return void - */ public function createPdfAs(CfdiData $cfdiData, string $destination): void { $this->builder->build($cfdiData, $destination); diff --git a/src/Script/ConvertOptions.php b/src/Script/ConvertOptions.php index 76142b1..22ac3d2 100644 --- a/src/Script/ConvertOptions.php +++ b/src/Script/ConvertOptions.php @@ -39,7 +39,7 @@ public function __construct( bool $askForVersion ) { if ('' === $outputFile && '' !== $inputFile) { - $outputFile = (string) preg_replace('/\.xml$/', '', $inputFile) . '.pdf'; + $outputFile = preg_replace('/\.xml$/', '', $inputFile) . '.pdf'; } $this->resolverLocation = $resolverLocation; @@ -88,8 +88,6 @@ public function fontsDirectory(): string /** * @param string[] $arguments - * - * @return self */ public static function createFromArguments(array $arguments): self { @@ -118,7 +116,7 @@ public static function createFromArguments(array $arguments): self } if (in_array($argument, ['-l', '--resource-location'], true)) { $i = $i + 1; - if (! ($i < $count)) { + if ($i >= $count) { throw new RuntimeException('The resource location parameter does not contains an argument'); } $resolverLocation = $arguments[$i]; @@ -126,7 +124,7 @@ public static function createFromArguments(array $arguments): self } if (in_array($argument, ['-f', '--fonts-dir'], true)) { $i = $i + 1; - if (! ($i < $count)) { + if ($i >= $count) { throw new RuntimeException('The fonts directory parameter does not contains an argument'); } $fontsDirectory = $arguments[$i]; diff --git a/src/Script/ConvertScript.php b/src/Script/ConvertScript.php index 8b2be65..225b49d 100644 --- a/src/Script/ConvertScript.php +++ b/src/Script/ConvertScript.php @@ -18,10 +18,6 @@ class ConvertScript { - /** - * @param ConvertOptions $options - * @return void - */ public function run(ConvertOptions $options): void { $source = $this->openSource($options->inputFile(), $options->doCleanInput()); @@ -144,10 +140,6 @@ private function recursiveRemove(string $directory): void rmdir($directory); } - /** - * @param string $directory - * @return Generator - */ private function readDirectory(string $directory): Generator { $directoryIterator = new DirectoryIterator($directory); diff --git a/tests/PdfToText/PdfToText.php b/tests/PdfToText/PdfToText.php index 0ce5c74..19c55bf 100644 --- a/tests/PdfToText/PdfToText.php +++ b/tests/PdfToText/PdfToText.php @@ -27,11 +27,10 @@ public function exists(): bool return false; } - return ('pdftotext ' === substr(trim($process->getErrorOutput()), 0, 10)); + return 'pdftotext ' === substr(trim($process->getErrorOutput()), 0, 10); } /** - * @param string $filename * @return string file contents */ public function extract(string $filename): string From aa9c92e394971c9965c124b3df65867cc7b42cd8 Mon Sep 17 00:00:00 2001 From: Carlos C Soto Date: Mon, 10 Nov 2025 11:30:59 -0600 Subject: [PATCH 12/19] Bump to PHP 7.4 --- .github/workflows/build.yml | 2 +- .github/workflows/publish.yml | 2 +- .php-cs-fixer.dist.php | 10 ++++----- composer.json | 2 +- src/Builders/Html2PdfBuilder.php | 3 +-- .../HtmlTranslators/PlatesHtmlTranslator.php | 6 ++---- src/CfdiData.php | 14 ++++++------- src/CfdiDataBuilder.php | 6 ++---- src/Converter.php | 3 +-- src/Script/ConvertOptions.php | 21 +++++++------------ templates/generic.php | 10 ++++----- tests/Integration/ConverterTest.php | 3 +-- .../Integration/Script/ConvertScriptTest.php | 6 ++---- tests/PdfToText/PdfToText.php | 6 +++--- tests/TestCase.php | 3 ++- 15 files changed, 40 insertions(+), 57 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c1a9ba..071f763 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -98,7 +98,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - php-version: ['7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4'] + php-version: ['7.4', '8.0', '8.1', '8.2', '8.3', '8.4'] steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 56a4531..eb77ee0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,7 +21,7 @@ jobs: - name: "Setup PHP" uses: shivammathur/setup-php@v2 with: - php-version: '7.3' # use minimal version + php-version: '7.4' # use minimal version extensions: soap, gd coverage: none tools: composer:v2 diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 482ef43..5537f31 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -15,32 +15,32 @@ ->setRules([ '@PSR12' => true, '@PSR12:risky' => true, - '@PHP7x3Migration' => true, - '@PHP7x1Migration:risky' => true, + '@PHP7x4Migration' => true, + '@PHP7x4Migration:risky' => true, // basic 'statement_indentation' => false, // invalid indentation // symfony + 'array_indentation' => true, 'class_attributes_separation' => true, 'whitespace_after_comma_in_array' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'type_declaration_spaces' => true, 'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['arrays', 'arguments']], - 'new_with_parentheses' => true, - 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'object_operator_without_whitespace' => true, 'binary_operator_spaces' => true, 'phpdoc_scalar' => true, 'no_trailing_comma_in_singleline' => true, 'single_quote' => true, - 'blank_lines_before_namespace' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_unused_imports' => true, 'yoda_style' => ['equal' => true, 'identical' => true, 'less_and_greater' => null], 'standardize_not_equals' => true, 'concat_space' => ['spacing' => 'one'], 'linebreak_after_opening_tag' => true, + 'fully_qualified_strict_types' => true, + 'global_namespace_import' => ['import_classes' => true], // symfony:risky 'no_alias_functions' => true, 'self_accessor' => true, diff --git a/composer.json b/composer.json index b9225d7..ee55043 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "source": "https://github.com/phpcfdi/cfditopdf" }, "require": { - "php": ">=7.3", + "php": ">=7.4", "eclipxe/cfdiutils": "^2.31 || ^3.0", "league/plates": "^3.5", "phpcfdi/cfdi-cleaner": "^1.3.3", diff --git a/src/Builders/Html2PdfBuilder.php b/src/Builders/Html2PdfBuilder.php index e611aff..b9e9baf 100644 --- a/src/Builders/Html2PdfBuilder.php +++ b/src/Builders/Html2PdfBuilder.php @@ -12,8 +12,7 @@ class Html2PdfBuilder implements BuilderInterface { - /** @var HtmlTranslators\HtmlTranslatorInterface */ - private $htmlTranslator; + private HtmlTranslatorInterface $htmlTranslator; /** * Html2PdfBuilder constructor. diff --git a/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php b/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php index b2c86d5..1ff6bf3 100644 --- a/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php +++ b/src/Builders/HtmlTranslators/PlatesHtmlTranslator.php @@ -9,11 +9,9 @@ class PlatesHtmlTranslator implements HtmlTranslatorInterface { - /** @var string */ - private $directory; + private string $directory; - /** @var string */ - private $template; + private string $template; /** * PlatesHtmlTranslator constructor. diff --git a/src/CfdiData.php b/src/CfdiData.php index f1ea624..7ead069 100644 --- a/src/CfdiData.php +++ b/src/CfdiData.php @@ -10,22 +10,20 @@ class CfdiData { /** @var NodeInterface */ - private $comprobante; + private NodeInterface $comprobante; /** @var NodeInterface */ - private $emisor; + private NodeInterface $emisor; /** @var NodeInterface */ - private $receptor; + private NodeInterface $receptor; /** @var NodeInterface */ - private $timbreFiscalDigital; + private NodeInterface $timbreFiscalDigital; - /** @var string */ - private $qrUrl; + private string $qrUrl; - /** @var string */ - private $tfdSourceString; + private string $tfdSourceString; /** * CfdiData constructor. diff --git a/src/CfdiDataBuilder.php b/src/CfdiDataBuilder.php index 3986e60..fd33424 100644 --- a/src/CfdiDataBuilder.php +++ b/src/CfdiDataBuilder.php @@ -17,11 +17,9 @@ class CfdiDataBuilder { use CastToStringTrait; - /** @var XmlResolver */ - private $xmlResolver; + private XmlResolver $xmlResolver; - /** @var XsltBuilderInterface */ - private $xsltBuilder; + private XsltBuilderInterface $xsltBuilder; public function __construct() { diff --git a/src/Converter.php b/src/Converter.php index aa23bf5..1db63b1 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -11,8 +11,7 @@ class Converter { - /** @var BuilderInterface */ - private $builder; + private BuilderInterface $builder; public function __construct(BuilderInterface $builder) { diff --git a/src/Script/ConvertOptions.php b/src/Script/ConvertOptions.php index 22ac3d2..b7c3d30 100644 --- a/src/Script/ConvertOptions.php +++ b/src/Script/ConvertOptions.php @@ -8,26 +8,19 @@ class ConvertOptions { - /** @var string */ - private $resolverLocation; + private string $resolverLocation; - /** @var string */ - private $fontsDirectory; + private string $fontsDirectory; - /** @var bool */ - private $doCleanInput; + private bool $doCleanInput; - /** @var string */ - private $inputFile; + private string $inputFile; - /** @var string */ - private $outputFile; + private string $outputFile; - /** @var bool */ - private $askForHelp; + private bool $askForHelp; - /** @var bool */ - private $askForVersion; + private bool $askForVersion; public function __construct( string $resolverLocation, diff --git a/templates/generic.php b/templates/generic.php index 25618cd..dfe798b 100644 --- a/templates/generic.php +++ b/templates/generic.php @@ -7,9 +7,9 @@ declare(strict_types=1); /** - * @var \League\Plates\Template\Template $this - * @var \PhpCfdi\CfdiToPdf\CfdiData $cfdiData - * @var \PhpCfdi\CfdiToPdf\Catalogs\CatalogsInterface|null $catalogos + * @var League\Plates\Template\Template $this + * @var PhpCfdi\CfdiToPdf\CfdiData $cfdiData + * @var PhpCfdi\CfdiToPdf\Catalogs\CatalogsInterface|null $catalogos */ $comprobante = $cfdiData->comprobante(); $emisor = $cfdiData->emisor(); @@ -22,8 +22,8 @@ $informacionGlobal = $comprobante->searchNode('cfdi:InformacionGlobal'); $conceptoCounter = 0; $conceptoCount = $conceptos->count(); -if (! isset($catalogos) || ! ($catalogos instanceof \PhpCfdi\CfdiToPdf\Catalogs\CatalogsInterface)) { - $catalogos = new \PhpCfdi\CfdiToPdf\Catalogs\StaticCatalogs(); +if (! isset($catalogos) || ! ($catalogos instanceof PhpCfdi\CfdiToPdf\Catalogs\CatalogsInterface)) { + $catalogos = new PhpCfdi\CfdiToPdf\Catalogs\StaticCatalogs(); } ?>