-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProcessarLoteNFe.ps1
More file actions
108 lines (88 loc) · 4.52 KB
/
ProcessarLoteNFe.ps1
File metadata and controls
108 lines (88 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<#
.SYNOPSIS
Processa em lote todos os arquivos XML de NF-e (modelo 55) de uma pasta de origem.
.DESCRIPTION
Este script monitora uma pasta de origem, encontra todos os arquivos .xml, e para cada um:
1. Usa uma Regex aprimorada para extrair um código de produto numérico da tag <infAdProd>.
2. Substitui o valor da tag <cProd> pelo código extraído.
3. Salva uma cópia técnica e modificada NA MESMA PASTA do arquivo original.
.AUTHOR
Desenvolvedor Backend Especializado em XML de NF-e
.VERSION
2.2.0 - Modificação para salvar o output na pasta de origem
#>
# --- Bloco de Configuração ---
# 1. Defina a pasta onde os arquivos XML originais estão localizados.
$pastaOrigem = "C:\Caminho\Para\Sua\PastaDeNotas"
# 2. Defina o prefixo para os novos arquivos.
$prefixoArquivoSaida = "arquivoImportacao"
# -----------------------------
# --- Validação e Preparação do Ambiente ---
Write-Host "Iniciando o processo de automação (v2.2)..." -ForegroundColor Green
if (-not (Test-Path $pastaOrigem)) {
Write-Error "ERRO: A pasta de origem '$pastaOrigem' não foi encontrada. Verifique o caminho e tente novamente."
return
}
# Busca por todos os arquivos .xml na pasta de origem
$arquivosXML = Get-ChildItem -Path $pastaOrigem -Filter *.xml -File
if ($arquivosXML.Count -eq 0) {
Write-Warning "Nenhum arquivo .xml foi encontrado na pasta '$pastaOrigem'. Encerrando o processo."
return
}
Write-Host "Encontrados $($arquivosXML.Count) arquivos XML para processar."
Write-Host "--------------------------------------------------------"
# --- Loop de Processamento Principal ---
foreach ($arquivo in $arquivosXML) {
# Ignora arquivos que já foram processados para evitar loops infinitos
if ($arquivo.Name -like "$($prefixoArquivoSaida)_*") {
Write-Host "[IGNORANDO]: O arquivo $($arquivo.Name) já é um arquivo processado." -ForegroundColor Gray
Write-Host ""
continue
}
Write-Host "[PROCESSANDO]: $($arquivo.Name)"
try {
$xmlDoc = New-Object System.Xml.XmlDocument
$xmlDoc.Load($arquivo.FullName)
$nsm = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
$nsm.AddNamespace("nfe", "http://www.portalfiscal.inf.br/nfe")
$itens = $xmlDoc.SelectNodes("//nfe:det", $nsm)
$alteracoesRealizadas = 0
foreach ($item in $itens) {
$nItem = $item.Attributes["nItem"].Value
$infAdProdNode = $item.SelectSingleNode("nfe:infAdProd", $nsm)
if ($null -ne $infAdProdNode) {
$textoInfAdProd = $infAdProdNode.InnerText.Trim()
$regex = "(?:c[oó]d|c[oó]digo|ref|refer[eê]ncia|produto)[\s\w\p{P}]*?(\d+)$"
$match = [regex]::Match($textoInfAdProd, $regex, "IgnoreCase")
if ($match.Success) {
$novoCodigoProduto = $match.Groups[1].Value
$cProdNode = $item.SelectSingleNode("nfe:prod/nfe:cProd", $nsm)
if ($null -ne $cProdNode) {
$codigoOriginal = $cProdNode.InnerText
Write-Host " [Item $nItem]: PADRÃO ENCONTRADO! | Alterando cProd de `"$codigoOriginal`" para `"$novoCodigoProduto`"" -ForegroundColor White
$cProdNode.InnerText = $novoCodigoProduto
$alteracoesRealizadas++
}
} else {
#Write-Host " [Item $nItem]: Padrão não encontrado no texto: `"$textoInfAdProd`". Nenhuma alteração." -ForegroundColor Gray
}
}
}
if ($alteracoesRealizadas -gt 0) {
$nomeArquivoSaida = "$($prefixoArquivoSaida)_$($arquivo.Name)"
# Alteração principal: Salva o arquivo na mesma pasta de origem ($pastaOrigem)
$caminhoArquivoSaida = Join-Path -Path $pastaOrigem -ChildPath $nomeArquivoSaida
$xmlDoc.Save($caminhoArquivoSaida)
Write-Host " -> Concluído. $alteracoesRealizadas alterações salvas como '$nomeArquivoSaida' na pasta de origem." -ForegroundColor Cyan
} else {
Write-Host " -> Concluído. Nenhuma alteração necessária para este arquivo." -ForegroundColor Yellow
}
Write-Host "" # Linha em branco para separar os arquivos
}
catch {
Write-Error "Ocorreu um erro crítico ao processar o arquivo '$($arquivo.Name)': $_"
continue
}
}
Write-Host "--------------------------------------------------------"
Write-Host "✅ Processo em lote finalizado." -ForegroundColor Green