Skip to content

Merge pull request #205 from LayoutParser/feat/resolucao-estrutural-txt-xml-140 - #206

Merged
elson-vinicius-lopes merged 5 commits into
masterfrom
develop
Aug 28, 2026
Merged

Merge pull request #205 from LayoutParser/feat/resolucao-estrutural-txt-xml-140#206
elson-vinicius-lopes merged 5 commits into
masterfrom
develop

Conversation

@elson-vinicius-lopes

Copy link
Copy Markdown
Collaborator

No description provided.

elson-vinicius-lopes and others added 5 commits August 27, 2026 19:57
…(issue #140, itens 1/3/4/5)

Implementa XmlLayoutStructureParser (le XSD real da SEFAZ NF-e via XmlSchemaSet,
mirror nfephp-org/sped-nfe PL_009_V4 - fonte de verdade decidida pelo dono
2026-08-27), XmlLayoutCatalog (resolução por caminho/leaf-name + XPath absoluto
com namespace), MappingKindClassifier (direct/transformed/concatenated/static
sobre StructuredRule, sem regex ad-hoc) e OccurrenceResolver +
FieldToXmlMappingComposer (lineOccurrence->xmlOccurrence e critério objetivo
authoritative/best-effort do design, §5).

25 testes novos: 8 contra o XSD real da NF-e, 6 do classificador, 11 do
composer cobrindo direct/static/concatenated/N->1/1->N/grupo repetido/mismatch
de repetição/loop dinâmico/função desconhecida/FunctionCatalog indisponível/
fallback por nome de folha. Sem regressão (36/36 verdes no projeto).

Escopo: só NF-e por ora, extensível por tipo de documento (fonte é
XSD+elemento raiz passados pelo chamador). Não implementa endpoint HTTP nem
validação comportamental contra LowCodeRunner real - fica para #140 itens 6-8.
…>XML ao pipeline real (issue #140, itens 2/6-9)

Conecta o motor ja implementado (ai/XslSynth.Contracts/Core/StructuralResolution/, commit
36ae5cb) a dados reais: Layout/ParsedField do parse posicional real (ILayoutParserService) +
MapperVo real via RealMapperParser sobre mapper decifrado (MapperDatabaseService) + catalogo
XML de destino (XSD NF-e) cacheado por TargetLayoutGuid via IMemoryCache.

- Services/Transformation/StructuralResolution/StructuralXmlCatalogCacheService.cs: cache do
  XmlLayoutCatalog (parse de XSD e caro), chave "structural-xml-catalog:{docType}:{targetGuid}",
  degrada para null (sem lancar) quando StructuralResolution:NfeSchemaPath nao configurado.
- Services/Transformation/StructuralResolution/FieldMappingCompositionService.cs: crosswalk
  GUID/nome do Layout de origem, resolve sources (LinkMappingItem por GUID, MapperRule via
  StructuredRule.AllSources por nome), usa ParsedField.Occurrence fisico real (nunca sintetico)
  e compoe via FieldToXmlMappingComposer ja existente.
- Controllers/TransformationExecutionController.cs: novo endpoint dedicado
  POST api/TransformationExecution/field-mappings — deliberadamente SEPARADO do contrato de
  execute-candidates (issue #141 decide se/como fieldMappings entra la).
- Program.cs/appsettings.json: AddMemoryCache, secao StructuralResolution, registro dos 2
  servicos novos (Singleton para o cache, Scoped para a composicao).
- Testes de integracao (fixtures/XSD real da NF-e) validando o wiring ponta-a-ponta e a
  degradacao sem XSD configurado; ajuste de 2 testes existentes do controller (novos parametros
  do construtor).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ssue #140)

23 testes deterministicos cobrindo a matriz do design §6.1 (TXT/MQSeries/IDOC,
grupo repetido/aninhado, atributo, concatenação, estático, condicional, função
de transformação, loop dinâmico, N:1/1:N, namespace não-default, mismatch de
repetição, função desconhecida). Documenta 2 gaps reais no composer
(IsDeclaredEmpty/PositionalAlignmentFailed não chegam ao motor) e confirma
que o critério authoritative/best-effort é conservador quando FunctionCatalog
está indisponível. Validação comportamental contra o LowCodeRunner.exe real
fica pendente (Windows-only, não roda neste ambiente) — registrado em
.claude/agent-memory/lp-qa/issue140-resolucao-estrutural-qa-gate.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… é linha vazia/degradada

Achado do @lp-qa (issue140-resolucao-estrutural-qa-gate.md, gap 2): LineInfo.IsDeclaredEmpty e
LineInfo.PositionalAlignmentFailed (contrato de degradacao posicional de 2026-08-27) nao chegavam
ao FieldMappingCompositionService, permitindo que um mapeamento vindo de linha vazia/degradada
saisse Authoritative. Adiciona uma 6a condicao de pos-processamento (FieldMappingCompositionService.
DegradeForUnhealthySourceLines) que so pode degradar Authoritative->BestEffort, nunca promover o
contrario - sem reescrever o criterio objetivo ja existente em FieldToXmlMappingComposer.

ParsingResult.LineInfos ja era populado internamente mas nao chegava ao composer; agora e passado
via TransformationExecutionController -> FieldMappingCompositionService.Compose(..., lineInfos).
@elson-vinicius-lopes
elson-vinicius-lopes merged commit 414d0d7 into master Aug 28, 2026
6 checks passed
@github-actions

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant