Repository navigation
feat(fiscal): busca de documentos em lote (NF-e e adiantamentos) com DANFE, XML e boleto - #299
Merged
malacration merged 9 commits intoOct 26, 2026
Conversation
Lista as NF-e emitidas para a SEFAZ (sap-odbc, OINV x "Process"), com status SAP/SEFAZ, chave de acesso e filtros, e baixa um zip com DANFE e XML da TaxPlus e boletos da BankPlus. Perfil nota_fiscal_lote no rules.yml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O @EnableScheduling sai do ServiceApplication para um SchedulingConfig condicional. Sem a chave, tudo continua ligado como antes; com jobs.scheduling.enabled=false, uma instancia local apontada para outra base nao roda as rotinas agendadas. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…DANFE, XML e boleto Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # src/main/resources/application.properties.sample # src/main/resources/rules.yml
…trato de venda futura
- Lista com uma linha por parcela (valor original e vencimento da parcela); download, troca
e "adicionar todas" (porDocumento) seguem um por documento.
- POST /nota-fiscal-lote/importar-planilha: monta o lote a partir da planilha de titulos do
BB (.xlsx), casando o nosso numero com os boletos da BankPlus (IV_IB_BillOfExchange).
Leitor xlsx proprio, com teto de tamanho e sem DOCTYPE.
- PDF do contrato de venda futura ("Controle de Pedido") no zip, um por contrato dos
adiantamentos; logo vem da tela.
- Nome do cliente nos nomes de arquivo do zip.
- Troca de forma: NF de venda futura do padrao antigo (CFOP 5922/6922) nem tenta o PATCH
e volta NAO_PERMITIDO.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…a lista do lote
- Forma de pagamento: nome da forma na lista (JOIN OPYM) e filtro :formaPagamento
('' todas, '-' sem forma); /formas-pagamento?todas=true inclui inativas para o filtro
(a troca segue so com ativas).
- Boleto da BankPlus por parcela: nosso numero, status (IV_IB_BoeStatus) e situacao
(IV_IB_BillOfExchangeSituation) do boleto mais recente da parcela; filtro :boletoStatus
(-2 todos, -1 sem boleto). Por documento, vencimento e status valem na mesma parcela.
- GET /nota-fiscal-lote/status-boleto no perfil nota_fiscal_lote.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # src/main/kotlin/br/andrew/sap/services/cadastro/BusinessPartnersService.kt
…/nota-fiscal-lote
This branch was successfully deployed
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.
O que muda
Backend da tela Financeiro > Notas e XML em lote. A tela lista documentos de saída e monta um lote para baixar um zip com DANFE, XML, boleto e contrato, e para trocar a forma de pagamento em massa.
Documentos e lista
U_venda_futura. Fica de fora o reconhecimento de adiantamento que o estorno cria (U_TX_DocEntryRef).docEntrieseadiantamentosseparados.InsTotal) e vencimento de cada parcela, e o filtro de vencimento vale por parcela.porDocumento=true) usam uma linha por documento; aí o documento entra se qualquer parcela vence no intervalo.LEFT JOIN OPYM). O filtroformaPagamentoaceita''(todas),-(sem forma) ou o código.GET /formas-pagamento?todas=trueinclui as formas inativas, para o filtro; sem esse parâmetro, só as ativas, que são as que a troca aceita.IV_IB_BoeStatus: Confirmado, Baixado, Cancelado...) e situação (IV_IB_BillOfExchangeSituation: Normal, Liquidado...). Quando a parcela tem boleto cancelado e reemitido, vale o mais recente (CTEBOLETOScomROW_NUMBERpor ID).boletoStatus:-2todos,-1sem boleto, ou o ID do status. Na lista vale para a linha.EXISTSsó), para o "adicionar todas" pegar exatamente os documentos que a lista mostra.odbc/nota-fiscal-lote.sql), com paginação no banco.Download (zip)
templates/contrato-venda-futura.html) e iText html2pdf.odbc/nota-fiscal-lote-contratos.sql).NF501-S2-C0001-JOAO_DA_SILVA.pdf,contrato/VF412-JOAO_DA_SILVA.pdf.erros.txtouavisos.txt.Importação da planilha do banco (novo)
POST /nota-fiscal-lote/importar-planilha, com o arquivo cru no corpo. Só lê, não grava nada..xlsx, com o cabeçalho "Nosso número | Nome pagador | Nro beneficiário | Valor | Vencimento | Situação" abaixo de um bloco de totais.IV_IB_BillOfExchange.OurNumber, a tabela que a BankPlus grava no banco da empresa. Daí saem tipo (13 = NF, 203 = AD), DocEntry e parcela (odbc/nota-fiscal-lote-boletos.sql).DIVERGENTE; nosso número desconhecido viraNAO_ENCONTRADO; documento que a tela não lista viraFORA_DA_TELA.PlanilhaXlsx, zip + DOM, sem dependência nova). Recusa DOCTYPE, e todas as partes do zip contam num teto de descompactado. O corpo é lido com teto de 10 MB, mesmo semContent-Length.Troca de forma de pagamento
PaymentMethodemInvoiceseDownPayments.NAO_PERMITIDO.nota-fiscal.lote.forma-prazo-segundos) e usa um pool único do serviço, porque o RestTemplate do Service Layer não tem timeout de leitura.ATUALIZADO,VINCULADO_E_ATUALIZADO,SEM_MUDANCA,ERRO,NAO_ENCONTRADO,NAO_PERMITIDOouSEM_CONFIRMACAO. O último sai quando o SAP pode ter gravado sem confirmar; o campopendenciamarca o que ficou por conferir.Endpoints (fora de
/tax, porque obusiness_partnertem/tax/**/pdf). Todos no perfilnota_fiscal_lotedorules.yml:GET /nota-fiscal-loteGET /nota-fiscal-lote/status-sefazGET /nota-fiscal-lote/status-boletoPOST /nota-fiscal-lote/downloadPOST /nota-fiscal-lote/clientes/searchGET /nota-fiscal-lote/formas-pagamentoPOST /nota-fiscal-lote/forma-pagamentoPOST /nota-fiscal-lote/importar-planilhajobs.scheduling.enabled(commit separado). O@EnableSchedulingsaiu doServiceApplicatione foi para umSchedulingConfigcondicional. Sem a chave, tudo fica ligado como antes. Comfalse, uma instância local apontada para outra base não roda as rotinas agendadas.Testes
JOINs, e a lista responde em cerca de 1 s.Antes de ligar em produção
nota_fiscal_loteno Keycloak e norules.ymldo swarm, que é o que vale em produção, incluindo/nota-fiscal-lote/importar-planilhae/nota-fiscal-lote/status-boleto.IV_IB_BillOfExchange,IV_IB_BoeStatus,IV_IB_BillOfExchangeSituation,@AR_CONTRATO_FUTUROe@AR_CF_LINHA.PaymentMethodainda não foi testado no SAP, só com mocks e consultas no HOMOLOG2. Vale testar em homologação antes.Par no front: malacration/sap-front#168.
🤖 Generated with Claude Code