OldComplianceNFs/Infrastructure/AccessRepository.cs

133 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Data.OleDb;
using Dapper;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using NfProcessorApp.Domain.Entities;
using NfProcessorApp.Domain.Repositories;
using NfProcessorApp.Handlers;
using NfProcessorApp.Infrastructure;
namespace NfProcessorApp.Infrastructure
{
/// <summary>
/// Implementação de INotaFiscalRepository usando banco Access
/// </summary>
public class AccessRepository : ITERepository, IDatabaseUpdater
{
private readonly string _connectionString;
private readonly ILogger<AccessRepository> _logger;
public AccessRepository(IConfiguration config, ILogger<AccessRepository> logger)
{
ArgumentNullException.ThrowIfNull(config);
ArgumentNullException.ThrowIfNull(logger);
_connectionString = config.GetConnectionString("AccessDb") ?? throw new InvalidOperationException("Connection string 'AccessDb' não configurada.");
_logger = logger;
}
public IEnumerable<TERecord> ObterCandidatos(string cnpjComprador, string cnpjVendedor)
{
const string sql = @"
SELECT Mont_LO AS Mont_LO,
Prec_LO AS Prec_LO,
NF_c_ICMS AS NF_c_ICMS,
Hora_NF AS Data
FROM Dados_TE DT
INNER JOIN Dados_Cadastrais DC ON DT.Cod_smart_unidade = DC.Cod_smart_unidade
WHERE DC.CNPJ_comp = @CNPJ_comp
AND DC.CNPJ_vend = @CNPJ_vend
ORDER BY Hora_NF DESC";
try
{
using var conn = new OleDbConnection(_connectionString);
return conn.Query<TERecord>(sql, new
{
CNPJ_comp = cnpjComprador,
CNPJ_vend = cnpjVendedor
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Erro obtendo candidatos com Dapper para {CNPJ_comp}/{CNPJ_vend}", cnpjComprador, cnpjVendedor);
#pragma warning disable IDE0301 // Simplificar a inicialização de coleção
return Array.Empty<TERecord>();
#pragma warning restore IDE0301 // Simplificar a inicialização de coleção
}
}
public void MarcarComoCorreta(string cod_TE, string numeroNF, DateTime dataVerificacao, string caminhoDestino)
{
const string sql = @"
UPDATE Dados_Cadastrais
SET Numero_NF = @Numero_NF,
NF_Correta = TRUE,
Hora_NF = @Hora_NF,
Caminho_NFs = @Caminho_NFs
WHERE Cod_TE = @Cod_TE";
try
{
using var conn = new OleDbConnection(_connectionString);
var affected = conn.Execute(sql, new
{
Cod_TE = cod_TE,
Numero_NF = numeroNF,
Hora_NF = dataVerificacao,
Caminho_NFs = caminhoDestino
});
_logger.LogInformation("Registros atualizados: {AffectedRows}", affected);
}
catch (Exception ex)
{
_logger.LogError(ex, "Erro ao marcar NF como correta com Dapper para Cod_TE {cod_TE}", cod_TE);
}
}
public string ObterCaminhoDestino(string cnpjComprador)
{
const string sql = @"
SELECT Caminho_NFs
FROM Dados_Cadastrais
WHERE CNPJ_CPF = @CNPJ_comp";
try
{
using var conn = new OleDbConnection(_connectionString);
return conn.QueryFirstOrDefault<string>(sql, new { CNPJ_comp = cnpjComprador })
?? string.Empty;
}
catch (Exception ex)
{
_logger.LogError(ex, "Erro ao obter caminho de destino para o cliente com CNPJ {CNPJ}", cnpjComprador);
return string.Empty;
}
}
/// <inheritdoc />
public void Update(NFResult result)
{
ArgumentNullException.ThrowIfNull(result);
// Data de verificação = momento atual
var dataVerificacao = DateTime.Now;
// Obtém caminho de destino usando o CNPJ do vendedor
var caminhoDestino = ObterCaminhoDestino(result.CNPJ_Vendedor);
var candidatos = ObterCandidatos(result.CNPJ_Comprador, result.CNPJ_Vendedor);
// Chama o método de marcação usando Cod_TE e NumeroNF do resultado
MarcarComoCorreta(
cod_TE: candidatos.First().Cod_TE.ToString(),
numeroNF: result.NumeroNF,
dataVerificacao: dataVerificacao,
caminhoDestino: caminhoDestino
);
}
}
}