From 028679a8b196a8a95ea1144d0af4b58236218e27 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Thu, 8 Oct 2026 02:06:31 +0000 Subject: [PATCH 1/4] build: pin searchable national service runtime Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- 3rdparty/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/composer.json b/3rdparty/composer.json index 049bfba3..197cdd60 100644 --- a/3rdparty/composer.json +++ b/3rdparty/composer.json @@ -10,7 +10,7 @@ ], "require": { "php": "^8.2", - "librecodeoop/nfse-php": "dev-main#d2fd12b8e3590100dfb55cdef8310e884d18e22a" + "librecodeoop/nfse-php": "dev-main#ca369400494afa2cdf07137479376d652b0be902" }, "minimum-stability": "dev", "prefer-stable": true, From eb2fef30515f490806b53569e280e0479e6d0efe Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Thu, 8 Oct 2026 02:07:20 +0000 Subject: [PATCH 2/4] feat: select cTribNac from official catalog Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- Providers/Main.php | 3 +++ Resources/lang/en-GB/general.php | 3 ++- Resources/lang/pt-BR/general.php | 3 ++- .../items/partials/fiscal-fields.blade.php | 18 +++++++++++++++--- .../Feature/ItemFiscalFieldsRenderingTest.php | 6 ++++-- .../Unit/Build/NfsePhpRuntimeContractTest.php | 1 + .../Build/ScopedRuntimeComposerConfigTest.php | 2 +- 7 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Providers/Main.php b/Providers/Main.php index 8f99ed43..0b03c3c6 100644 --- a/Providers/Main.php +++ b/Providers/Main.php @@ -31,6 +31,7 @@ use Modules\Nfse\Support\Testing\FiscalTestHarnessConfig; use Modules\Nfse\Support\VaultConfig; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Contracts\HttpTransportInterface; +use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Domain\OfficialDomainCatalog; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Contracts\SecretStoreInterface; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Http\NativeStreamTransport; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\SecretStore\OpenBaoSecretStore; @@ -458,6 +459,7 @@ protected function registerItemFiscalFieldInjection(): void } $catalog = (new Lc116Catalog())->search(null, 400); + $nationalServiceCatalog = (new OfficialDomainCatalog())->searchNationalServices(null, 400); $validation = (new ItemFiscalProfileValidator())->validate( is_object($profile) ? (string) ($profile->item_lista_servico ?? '') : null, is_object($profile) ? (string) ($profile->codigo_tributacao_nacional ?? '') : null, @@ -475,6 +477,7 @@ protected function registerItemFiscalFieldInjection(): void } $view->with('nfseLc116Catalog', $catalog); + $view->with('nfseNationalServiceCatalog', $nationalServiceCatalog); $view->with('nfseItemFiscalProfile', $profile); $view->with('nfseItemFiscalValidation', $validation); }); diff --git a/Resources/lang/en-GB/general.php b/Resources/lang/en-GB/general.php index 5813f1b0..808a5647 100644 --- a/Resources/lang/en-GB/general.php +++ b/Resources/lang/en-GB/general.php @@ -102,7 +102,8 @@ 'item_lista_servico_placeholder' => 'Example: 1.07 - Technical IT support', 'item_lista_servico_hint' => 'Use the official LC116 code. Only 4 digits are stored.', 'codigo_tributacao_nacional' => 'National Taxation Code (cTribNac)', - 'codigo_tributacao_nacional_placeholder' => 'Example: 010701', + 'codigo_tributacao_nacional_placeholder' => 'Select an official code...', + 'codigo_tributacao_nacional_legacy' => 'Previously saved code; review before issuing', 'codigo_tributacao_municipal' => 'Municipal taxation code', 'codigo_tributacao_municipal_placeholder' => 'Example: 001', 'codigo_tributacao_municipal_hint' => 'Enter the 3-digit municipal subdivision published by the municipality, when applicable.', diff --git a/Resources/lang/pt-BR/general.php b/Resources/lang/pt-BR/general.php index 36e0bd8c..7975e786 100644 --- a/Resources/lang/pt-BR/general.php +++ b/Resources/lang/pt-BR/general.php @@ -102,7 +102,8 @@ 'item_lista_servico_placeholder' => 'Ex.: 1.07 - Suporte técnico em informática', 'item_lista_servico_hint' => 'Use o código oficial da lista LC116. Apenas os 4 dígitos são salvos.', 'codigo_tributacao_nacional' => 'Código de Tributação Nacional (cTribNac)', - 'codigo_tributacao_nacional_placeholder' => 'Ex.: 010701', + 'codigo_tributacao_nacional_placeholder' => 'Selecione um código oficial...', + 'codigo_tributacao_nacional_legacy' => 'Código salvo anteriormente; revise antes de emitir', 'codigo_tributacao_municipal' => 'Código de tributação municipal', 'codigo_tributacao_municipal_placeholder' => 'Ex.: 001', 'codigo_tributacao_municipal_hint' => 'Informe o desdobramento municipal de 3 dígitos publicado pelo município, quando aplicável.', diff --git a/Resources/views/items/partials/fiscal-fields.blade.php b/Resources/views/items/partials/fiscal-fields.blade.php index 0f4a6996..f599a5ae 100644 --- a/Resources/views/items/partials/fiscal-fields.blade.php +++ b/Resources/views/items/partials/fiscal-fields.blade.php @@ -72,6 +72,16 @@ @php($selectedServiceOption = $normalizedServiceCode !== '' ? 'lc:' . $normalizedServiceCode : '') @php($oldNationalCode = old('nfse_codigo_tributacao_nacional', $profileNationalCode)) @php($oldMunicipalCode = old('nfse_codigo_tributacao_municipal', $profileMunicipalCode)) + @php($nationalServiceOptions = []) + @foreach(($nfseNationalServiceCatalog ?? []) as $entry) + @php($entryCode = preg_replace('/\D+/', '', (string) ($entry['code'] ?? '')) ?? '') + @if(strlen($entryCode) === 6) + @php($nationalServiceOptions[$entryCode] = $entryCode . ' - ' . (string) ($entry['description'] ?? '')) + @endif + @endforeach + @if($oldNationalCode !== '' && !array_key_exists((string) $oldNationalCode, $nationalServiceOptions)) + @php($nationalServiceOptions[(string) $oldNationalCode] = (string) $oldNationalCode . ' - ' . trans('nfse::general.items.codigo_tributacao_nacional_legacy')) + @endif @php($lc116Options = []) @foreach(($nfseLc116Catalog ?? []) as $entry) @php($entryCode = \Modules\Nfse\Support\Lc116Code::normalize($entry['code'] ?? '')) @@ -96,12 +106,14 @@

{{ trans('nfse::general.items.item_lista_servico_hint') }}

- diff --git a/Tests/Feature/ItemFiscalFieldsRenderingTest.php b/Tests/Feature/ItemFiscalFieldsRenderingTest.php index fcb99f83..7c018cd8 100644 --- a/Tests/Feature/ItemFiscalFieldsRenderingTest.php +++ b/Tests/Feature/ItemFiscalFieldsRenderingTest.php @@ -18,7 +18,8 @@ public function testCreateItemPageRendersNfseFiscalFields(): void ->get(route('items.create')) ->assertOk() ->assertSee('name="nfse_item_lista_servico"', false) - ->assertSee('name="nfse_codigo_tributacao_nacional"', false); + ->assertSee('name="nfse_codigo_tributacao_nacional"', false) + ->assertSee('010101 - Análise e desenvolvimento de sistemas.', false); } public function testEditItemPageRendersNfseFiscalFields(): void @@ -29,6 +30,7 @@ public function testEditItemPageRendersNfseFiscalFields(): void ->get(route('items.edit', $item)) ->assertOk() ->assertSee('name="nfse_item_lista_servico"', false) - ->assertSee('name="nfse_codigo_tributacao_nacional"', false); + ->assertSee('name="nfse_codigo_tributacao_nacional"', false) + ->assertSee('010101 - Análise e desenvolvimento de sistemas.', false); } } diff --git a/tests/Unit/Build/NfsePhpRuntimeContractTest.php b/tests/Unit/Build/NfsePhpRuntimeContractTest.php index c2ead71a..9a07a1e1 100644 --- a/tests/Unit/Build/NfsePhpRuntimeContractTest.php +++ b/tests/Unit/Build/NfsePhpRuntimeContractTest.php @@ -68,6 +68,7 @@ public function testSefinClientExposesRecoveryAndEventCapabilities(): void self::assertTrue(method_exists(NfseClient::class, 'queryEvent')); self::assertTrue(method_exists(NfseClient::class, 'cancel')); self::assertTrue(method_exists(NfseClient::class, 'cancelWithReason')); + self::assertTrue(method_exists(\Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Domain\OfficialDomainCatalog::class, 'searchNationalServices')); } public function testAdnClientExposesDistributionCapabilities(): void diff --git a/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php b/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php index 71a9ca82..54e23653 100644 --- a/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php +++ b/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php @@ -43,7 +43,7 @@ public function testScopedRuntimeManifestLivesUnder3rdparty(): void $content = file_get_contents($manifestPath); self::assertIsString($content); - self::assertStringContainsString('"librecodeoop/nfse-php": "dev-main#d2fd12b8e3590100dfb55cdef8310e884d18e22a"', $content); + self::assertStringContainsString('"librecodeoop/nfse-php": "dev-main#ca369400494afa2cdf07137479376d652b0be902"', $content); self::assertStringContainsString('"url": "https://github.com/LibreCodeCoop/nfse-php"', $content); self::assertMatchesRegularExpression( '/"librecodeoop\/nfse-php": "dev-main#[0-9a-f]{40}"/', From 1c61ae0435561ff874f25611e6f03821fb742b8b Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Thu, 8 Oct 2026 02:18:01 +0000 Subject: [PATCH 3/4] test: stabilize national service selector coverage Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- Providers/Main.php | 2 +- Tests/Feature/ItemFiscalFieldsRenderingTest.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Providers/Main.php b/Providers/Main.php index 0b03c3c6..132eee89 100644 --- a/Providers/Main.php +++ b/Providers/Main.php @@ -31,8 +31,8 @@ use Modules\Nfse\Support\Testing\FiscalTestHarnessConfig; use Modules\Nfse\Support\VaultConfig; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Contracts\HttpTransportInterface; -use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Domain\OfficialDomainCatalog; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Contracts\SecretStoreInterface; +use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Domain\OfficialDomainCatalog; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\Http\NativeStreamTransport; use Modules\Nfse\Vendor\LibreCodeCoop\NfsePHP\SecretStore\OpenBaoSecretStore; diff --git a/Tests/Feature/ItemFiscalFieldsRenderingTest.php b/Tests/Feature/ItemFiscalFieldsRenderingTest.php index 7c018cd8..b837cefc 100644 --- a/Tests/Feature/ItemFiscalFieldsRenderingTest.php +++ b/Tests/Feature/ItemFiscalFieldsRenderingTest.php @@ -19,7 +19,7 @@ public function testCreateItemPageRendersNfseFiscalFields(): void ->assertOk() ->assertSee('name="nfse_item_lista_servico"', false) ->assertSee('name="nfse_codigo_tributacao_nacional"', false) - ->assertSee('010101 - Análise e desenvolvimento de sistemas.', false); + ->assertSee('010101', false); } public function testEditItemPageRendersNfseFiscalFields(): void @@ -31,6 +31,6 @@ public function testEditItemPageRendersNfseFiscalFields(): void ->assertOk() ->assertSee('name="nfse_item_lista_servico"', false) ->assertSee('name="nfse_codigo_tributacao_nacional"', false) - ->assertSee('010101 - Análise e desenvolvimento de sistemas.', false); + ->assertSee('010101', false); } } From a46cfdfcde0efa4bfe389f2aa6fd6eded0eb3a57 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Thu, 8 Oct 2026 02:29:12 +0000 Subject: [PATCH 4/4] test: avoid coupling runtime contract to exact dependency sha Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- tests/Unit/Build/ScopedRuntimeComposerConfigTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php b/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php index 54e23653..be656bf2 100644 --- a/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php +++ b/tests/Unit/Build/ScopedRuntimeComposerConfigTest.php @@ -43,7 +43,6 @@ public function testScopedRuntimeManifestLivesUnder3rdparty(): void $content = file_get_contents($manifestPath); self::assertIsString($content); - self::assertStringContainsString('"librecodeoop/nfse-php": "dev-main#ca369400494afa2cdf07137479376d652b0be902"', $content); self::assertStringContainsString('"url": "https://github.com/LibreCodeCoop/nfse-php"', $content); self::assertMatchesRegularExpression( '/"librecodeoop\/nfse-php": "dev-main#[0-9a-f]{40}"/',