Merge pull request #205 from LayoutParser/feat/resolucao-estrutural-txt-xml-140 - #206
Merged
Conversation
…(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).
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.